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

sga*_*a62 21 python django django-models django-contenttypes generic-foreign-key

我已经多次仔细研究了关于contenttypes框架的Django文档,而我根本不理解它在我的项目中实现泛型关系.我已经找到了有关此事的在线示例或教程,但我找不到一个.叫我笨,但我需要一些帮助(请不要简单地链接到文档).基于在线资源的缺乏,我相信如果你用一个详尽的例子回答这个问题,你的答案可能是迄今为止关于django泛型关系的最有用的例子(奖金!).

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


作为灵感,我认为这是一个非常常见的情况:

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

我相信你需要六种型号:

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

如果您知道如何使用这个Django功能,请向我们展示一个完整的示例!我觉得这将是一个非常强大的工具,我很想在我的应用程序中使用它.越明确越好.

Mic*_*nor 6

您的用例听起来与(现已弃用的)Django评论框架非常相似.如果您查看模型,您将看到如何在BaseCommentAbstractModel-note中使用通用关系,您需要所有三个字段,a ForeignKeyto ContentType,用于保存对象pkGenericForeignKey字段和字段.

至于如何查询对象GenericForeignKey,可以在该项目的模板标签中看到一些示例.例如,参见get_query_setin中的方法BaseCommentNode,该方法通过查询目标对象的内容类型和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,
    )
Run Code Online (Sandbox Code Playgroud)