【问题标题】:Exclude null GenericForeignKey objects from Django query从 Django 查询中排除空的 GenericForeignKey 对象
【发布时间】:2013-08-26 03:36:47
【问题描述】:

我有一个 ActivityLog Django 模型,它定义了具有以下字段的通用外键:

model_type = models.ForeignKey(ContentType, verbose_name=_("Object type"))
object_id = models.PositiveIntegerField(_("Object id"))
object = generic.GenericForeignKey('model_type', 'object_id')

我需要过滤未删除相关objectActivityLog 实例(不是None)。 Django 没有在GenericForeignKey 中执行删除级联,我需要从查找中排除这些不需要的记录。有没有简单、标准和有效的方法来做到这一点?

在一个美好的世界里,我会使用类似的东西:

real_activity_logs = ActivityLog.objects.filter(object__isnull=False)

但这不起作用,因为object 不是数据库字段。

【问题讨论】:

    标签: django django-models generic-foreign-key


    【解决方案1】:

    如果您希望在级联中删除这些ActivityLog 实例,您可以通过在指向的对象上定义GenericRelation 来实现。来自documentation

    另请注意,如果您删除具有 GenericRelation 的对象,则任何具有 指向它的 GenericForeignKey 也会被删除。

    【讨论】:

    • 在将这个问题发布给 SO 并经过更深入的研究和测试后,我找到了您给出的正确答案。有两点需要注意:1)如果包含GenericForeignKey的模型被指向模型通过普通的ForeignKey引用,则必须在GenericForeignKey中设置related_name或用'+'禁用它。 2)您可以在抽象模型中定义GenericRelation,这与定义关系相反(在这种情况下,您必须按照文档中的说明正确设置related_name)。谢谢!
    • @Caumons 很高兴听到这个消息,感谢您的额外澄清。
    猜你喜欢
    • 2014-04-09
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2012-09-10
    相关资源
    最近更新 更多