我有一个自引用的模型事物。关系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。这当然不是一个好的解决方案。
答案 0 :(得分:1)
您可以过滤:
Thing.objects.filter(copied_from=None)
这将因此检索 Thing
为 copied_from
的所有 None
。
如果您想检索所有不是副本且未被复制的 Thing
,您可以使用:
Thing.objects.filter(copied_from=None, copies=None)
或者如果您想检索不存在 Thing
的 Thing
是从它的副本,您可以使用:
Thing.objects.filter(copies=None)
这是可行的,因为我们在 LEFT OUTER JOIN
表上执行 Thing
,并且只检索 Thing
为 LEFT OUTER JOIN
的 NULL
。