Django:如何选择没有其他项目引用的项目?

lskq00tm  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(116)

假设我们有一个模型:

class Critters(models.Model):
    name = models.CharField()
    parent = models.ForeignKey(Critters, blank=True, null=True, on_delete=models.CASCADE)

字符串
一开始是一些小动物:

id  Name      Parent
==  ========  ========
 0  Critter1
 1  Critter2
 2  Critter3


然后,一些动物生了一个孩子:

id  Name      Parent
==  ========  ======
 0  Critter1
 1  Critter2
 2  Critter3
 3  Child1         0
 4  Child2         1


我想请求选择所有没有孩子的父母(即没有生物有父母,也没有父母有子女):

id  Name      Parent
==  ========  ======
 2  Critter3


我认为这可以用annotateexact django的指令来完成,但我不知道我到底如何才能完成这个任务。

UPDATE1当然,Name字段中的critterchild,例如,我们不能通过Name过滤表。

zz2j4svz

zz2j4svz1#

我认为这可以通过注解和精确的django指令来完成。
它可以做得更简单。您可以通过以下方式进行过滤:

Critters.objects.filter(parent=None, critters=None)

字符串
因此,我们在反向关系上进行过滤。这是LEFT OUTER JOIN,然后检查是否是None。因此,它将生成一个类似于以下的查询:

SELECT *
FROM critters
LEFT OUTER JOIN critters AS c ON c.parent_id = critters.id
WHERE parent_id IS NULL AND c.id IS NULL

u1ehiz5o

u1ehiz5o2#

有点搞不清你想干什么。如果要选择父项不存在的所有值,可以通过以下操作实现:

Critters.objects.filter(parent=None)

字符串
.exclude也可以使用。

相关问题