Django - queryset和通用SQL问题

2024-05-29 07:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

首先给定一个模型Foo,它是指向Bar的m2m,下面的查询是如何工作的(当没有任何东西是NULL本身时(join和first part ommited):

>> print Foo.objects.get(bar__isnull=True).query
...WHERE "barapp_bar"."id" IS NULL

空的东西让我对相关m2m的过滤感到厌烦

其次在处理大量行时,是否有方法使类似查询更快:

Foo.objects.get(bar__in=[bar1, bar2, bar3, bar4])

Tags: 模型getobjectsfoobarnullfirst指向
1条回答
网友
1楼 · 发布于 2024-05-29 07:39:36

指定的连接很重要。如果您查看完整的查询,您将看到Django执行两个Left Outer Joinsfoo表到连接表foo_barbar表。你知道吗

考虑两个foos和两个bars。设foo_1bar_1bar_2相关,且foo_2与任何bars无关。你知道吗

下面的查询包含两个左外联接,至少包含一次每个foo,空值将出现在foo_2的条形列中,该列与任何bars都不相关。你知道吗

SELECT foo.id as foo_id, bar.id as bar_id 
FROM foo LEFT OUTER JOIN foo_bar 
  ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
  ON foo_bar.bar_id = bar.id;
+    +    +
| foo_id | bar_id | 
+    +    +
| 1      | 1      |
| 1      | 2      |
| 2      | NULL   |
+    +    +

Foo.objects.get(bar__isnull=True)的查询与此类似,但它不从bar表中选择任何内容,对bar.id的筛选是NULL,因为我们只需要与任何bars无关的foos。你知道吗

SELECT foo.id as foo_id 
FROM foo LEFT OUTER JOIN foo_bar 
  ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
  ON foo_bar.bar_id = bar.id
where bar_id is NULL;
+    +
| foo_id | 
+    +
| 2      |
+    +

相关问题 更多 >

    热门问题