假设我们有一个模型:

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

我想请求 Select all parents without childrens(即没有有父母的生物,也没有有已有子女的父母):

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

我认为用Django的annotateexact指令就可以做到,但我不知道我到底能做什么……

UPDATE1 当然,仅以字段Name中的critterchild为例,我们不能按Name筛选表.

推荐答案

我认为这可以通过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

Django相关问答推荐

如何在django模板中渲染标签集

RDBMS多对多关系Django

当使用django-tinymce时,我在哪里指定referer?

源自访问外键关系的模型方法 get_absolute_url 的 django 重复 SQL 查询

为什么 Django 在错误的目录中寻找模板?

使用django提交后如何保留html表单数据?

- 不支持的操作数类型:DateField和DateField

在模板中调用 FileField 对象会呈现不正确的路径

django - 让用户登录到测试客户端

模型中的外键

Django BigInteger自动增量字段作为主键?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

Django 国际化语言代码

在 Mac OS X 上安装支持 JPEG 的 PIL

从表单获取模型实例而不保存

从 django/python 中的 request.POST 检索列表项

Django:以 10 为底的 int() 的无效文字

显式 cursor.close() 的必要性

如何将类、id、占位符属性添加到 django 模型表单中的字段

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件