我有一个带有通用外键的简单模型:
class Generic(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
我希望过滤掉这个表格中所有具有非空
content_object
的条目,即过滤掉所有Generic
实例中不存在内容对象的条目:Generic.objects.filter(~Q(content_object=None))
这段代码无法运行,会抛出异常:
django.core.exceptions.FieldError: 字段'content_object'没有生成自动反向关系,因此无法用于反向查询。如果它是GenericForeignKey,请考虑添加GenericRelation。
在引用的内容类型模型中添加GenericRelation没有任何影响。
如何实现这一点?非常感谢您的帮助。
编辑:我意识到我可以级联删除,但在我的情况下这不是一个选项(我希望保留数据)。
object_id
字段是否为空,而不是由该ID引用的相关对象。无论如何,如果您修复它,它仍会产生与原始问题中发布的相同异常。在这里过滤或排除没有任何区别。FWIW,检查= None
与isnull = True
相同。 - Bencontent_object
是什么意思呢?它只是你的数据库中两个实际字段的一个(足够薄的)包装器。如果你想要排除没有引用任何其他模型的Generics
,我给出的查询就是有效的。或者请在答案中进一步明确你对"null object"的定义。 - Alex Morozovcontent_type_id
定义的表中的id检索该对象。例如,如果您对已删除的对象具有通用关系。 - Benobject_id
而不是pk
:.exclude(object_id__in=ct.model_class().objects.all())
? (因为pk
将会参考Generic
对象本身的id,而不是你想要检查的相关模型的id。) - medmunds