在Django queryset

时间:2016-01-26 15:39:24

标签: python django django-queryset django-generic-views django-contenttypes

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

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添加到引用的内容类型模型没有任何区别。

如何实现这一目标的任何帮助都将不胜感激,非常感谢。

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

1 个答案:

答案 0 :(得分:5)

如果您要过滤某些 out 的记录,使用exclude()方法通常会更好:

      chart.setTitle(null, {
        text: "after drilldown subtitle" //subtitle options
      });

但请注意,您的模型现在不允许空Generic.objects.exclude(object_id__isnull=True) 个字段。要更改此行为,请{}向content_objectnull=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信号。