gpt4 book ai didi

python - 在 Django 查询集中过滤不存在​​的 GenericForeignKey 对象

转载 作者:太空狗 更新时间:2023-10-30 00:02:09 25 4
gpt4 key购买 nike

我有一个带有通用外键的简单模型:

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: Field 'content_object' does not generate an automatic reverse relation and therefore cannot be used for reverse querying. If it is a GenericForeignKey, consider adding a GenericRelation.

GenericRelation 添加到引用的内容类型模型没有任何区别。

非常感谢任何有关如何实现这一目标的帮助。

编辑:我知道我可以级联删除,但是在我的情况下这不是一个选项(我希望保留数据)。

最佳答案

如果你想过滤掉一些记录,通常最好使用exclude()方法:

Generic.objects.exclude(object_id__isnull=True)

但请注意,您的模型现在不允许空的 content_object 字段。要改变这种行为,use object_idcontent_type 字段的 null=True 参数。

更新

好吧,既然问题已经从过滤掉空记录转移到在没有 RDBMS 本身帮助的情况下确定损坏的 RDBMS 引用,我建议一个(相当慢且需要内存的)解决方法:

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))

这可以作为一次性脚本使用,但不是一个可靠的解决方案。如果你绝对想保留数据,我能想到的唯一快速方法是在你的 Generic 模型中有一个 is_deleted bool 标志并将它设置在 ( post|pre)_delete 信号。

关于python - 在 Django 查询集中过滤不存在​​的 GenericForeignKey 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com