Django 查询自引用查询集

时间:2021-04-05 11:22:12

标签: sql django orm

我有一个自引用的模型事物。关系copy_from 用于保存当前Thing-Object 从中复制的Thing-Object。这是我的模型:

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 来获取所有事物并“减去”所有已复制的事物。问题是,在我的解决方案中,我必须遍历 Queryset 其中 copied_from__is_null=False 以获取已用于创建副本的事物的 id。这当然不是一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以过滤:

Thing.objects.filter(copied_from=None)

这将因此检索 Thingcopied_from 的所有 None

如果您想检索所有不是副本且未被复制的 Thing,您可以使用:

Thing.objects.filter(copied_from=None, copies=None)

或者如果您想检索不存在 ThingThing 是从它的副本,您可以使用:

Thing.objects.filter(copies=None)

这是可行的,因为我们在 LEFT OUTER JOIN 表上执行 Thing,并且只检索 ThingLEFT OUTER JOINNULL

相关问题