[英]Django - queryset and general SQL questions
首先,给定一个 model Foo
并且它的 m2m 指向Bar
,以下查询如何工作(当NULL
本身没有任何内容时(加入和第一部分省略):
>> print Foo.objects.get(bar__isnull=True).query
...WHERE "barapp_bar"."id" IS NULL
null 的东西让我对相关 m2m 的过滤感到失望。
其次,有没有办法在处理大量行时使这个类似的查询更快:
Foo.objects.get(bar__in=[bar1, bar2, bar3, bar4])
省略的连接很重要。 如果查看完整查询,您将看到 Django 从foo
表到连接表foo_bar
和bar
表执行了两次左外连接。
考虑两个foos
和两个bars
。 让foo_1
与bar_1
和bar_2
相关,而foo_2
不与任何bars
相关。
下面的查询带有两个左外连接,每个foo
至少包含一次,并且 NULL 将出现在foo_2
的 bar 列中,它与任何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)
的查询与此类似,但它没有 select 来自 bar 表的任何内容,它过滤bar.id
为NULL
,因为我们只想要不相关的foos
到任何bars
。
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 |
+--------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.