我有一个带有通用外键的简单模型:
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
添加到引用的内容类型模型没有任何区别。
如何实现这一目标的任何帮助都将不胜感激,非常感谢。
编辑:我意识到我可以级联删除,但在我的情况下这不是一个选项(我希望保留数据)。
答案 0 :(得分:5)
如果您要过滤某些 out 的记录,使用exclude()
方法通常会更好:
chart.setTitle(null, {
text: "after drilldown subtitle" //subtitle options
});
但请注意,您的模型现在不允许空Generic.objects.exclude(object_id__isnull=True)
个字段。要更改此行为,请{}向content_object
和null=True
字段use object_id
个参数。
好的,既然问题已经从过滤掉空记录转移到确定破坏的RDBMS引用而没有RDBMS本身的帮助,我建议(相当慢和内存饥饿)的解决方法:
content_type
这可以作为一次性脚本,但不是一个强大的解决方案。如果您绝对想要保留数据,我唯一能想到的快速方法是在broken_items = []
for ct in ContentType.objects.all():
broken_items.extend(
Generic.objects
.filter(content_type=ct)
.exclude(object_id__in=ct.model_class().objects.all())
.values_list('pk', flat=True))
模型中设置is_deleted
布尔标记,并将其设置为Generic
信号。