Django:使用contenttypes框架的泛型关系的例子



关于内容类型框架,我已经研究了Django文档好几次了,但我对它的理解还不够好,无法在我的项目中实现泛型关系。我在网上找过关于这个问题的例子或教程,但我找不到一个。你可以说我是笨蛋,但我在这个问题上需要一些帮助(请不要简单地链接到文档来回答)。基于缺乏在线资源,我相信如果你用一个完整的例子来回答这个问题,你的答案可能是迄今为止关于django泛型关系最有帮助的在线例子(奖励!)。

所以,我的问题是:有人可以展示模型的一个简单的例子,也许几行代码显示如何与通用模型的实例交互?


作为启发,以下是我认为很常见的情况:

一个站点的媒体项在很大程度上是相同的,但略有不同。例如,假设有图片和视频项目,用户可以"喜欢"一个项目或"评论"一个项目。点赞和评论应该被同等对待,无论它们是发布在图片还是视频项目上。因此,如果有一个用于查看用户相册中的图像或视频的ItemView,则可以调用以下类型:mediaitem.comments.all()len(mediaitem.likes.all())comment.user_who_commented,而不必知道它是哪种媒体项目(图像或视频)

我相信你需要六个模型来做这个:

    MediaItem类摘要
  • 两种不同类型的媒体项目:ImageItemVideoItem
  • MediaItemActions类摘要
  • 可以对媒体项执行的两种不同类型的操作:LikeComment

如果你知道如何使用这个Django特性,请给我们一个完整的例子!我觉得这将是一个非常强大的工具,我渴望在我的应用程序中使用它。越明确越好

你的用例听起来很像(现在已经弃用了)Django注释框架。如果您查看这些模型,您将看到如何在BaseCommentAbstractModel中使用泛型关系——注意,您需要所有三个字段,一个ForeignKeyContentType,一个用于保存对象的pk s的字段,以及GenericForeignKey字段。

关于如何通过GenericForeignKey查询对象,您可以在该项目的模板标记中看到一些示例。例如,参见BaseCommentNode中的get_query_set方法,它通过查询目标对象的内容类型和pk来检索评论。

def get_query_set(self, context):
    ctype, object_pk = self.get_target_ctype_pk(context)
    if not object_pk:
        return self.comment_model.objects.none()
    qs = self.comment_model.objects.filter(
        content_type = ctype,
        object_pk    = smart_text(object_pk),
        site__pk     = settings.SITE_ID,
    )

我在我的一个项目中实际上有一个非常类似的情况,使用各种媒体类型。

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
class ReviewedItem(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    review = models.ForeignKey("Review")
class CreativeWork(models.Model):
  #other fields 
  keywords = generic.GenericRelation("TaggedItem",null=True, blank=True, default=None)
  reviews = generic.GenericRelation("ReviewedItem",null=True, blank=True, default=None)
class MediaObject(CreativeWork):
  #fields
class VideoObject(MediaObject):
  #fields
class AudioObject(MediaObject):
  #fields

每个视频或音频是一个MediaObject,这是一个创造性的工作。CreativeWorks与标签和评论有通用关系。所以现在任何东西都可以被标记或审查。

所有你需要的是为'action'有一个ForeignKey到ContentType。然后将GenericRelation添加到模型中。我找到了姜戈。文档会很有帮助:)但如果没有,希望这能有所帮助。

另一个选择是多态模型。我不会说这是你应该走的路,但这可能是一种选择。

我是通用外键和多态模型的粉丝。多态模型在模型中有很多相似性的情况下工作得最好。

相关内容

  • 没有找到相关文章

最新更新