Django 查询自引用查询集

Django query self referencing queryset

我有一个自引用模型。关系 copied_from 用于保存从中复制当前事物对象的事物对象。这是我的模型:

class Thing(models.Model):
    copied_from = models.ForeignKey("Thing", related_name="copies", null=True, default=None, on_delete=models.SET_NULL)
    collection = models.ForeignKey(Collection, ...)
    ...    
    

我想要实现的是从一个集合中获取所有没有被复制的东西。我正在考虑使用 union 来获取所有事物并“减去”所有已复制的事物。问题是,在我的解决方案中,我必须遍历 copied_from__is_null=False 处的查询集以获取已用于创建副本的事物的 ID。这当然不是一个好的解决方案。

您可以过滤:

Thing.objects.filter(<b>copied_from=None</b>)

这将检索所有 Thing,其中 copied_fromNone

如果要检索所有 Thing 没有副本且未被复制的内容,您可以使用:

Thing.objects.filter(<b>copied_from=None, copies=None</b>)

或者如果你想检索 Thing 没有 Thing 的副本,你可以使用:

Thing.objects.filter(<b>copies=None</b>)

这是可行的,因为我们在 Thing table 上执行 LEFT OUTER JOIN,并且只检索 LEFT OUTER JOIN 是 [=20] 的 Thing =].