繁体   English   中英

Django - 查询集和一般 SQL 问题

[英]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_barbar表执行了两次左外连接

考虑两个foos和两个bars foo_1bar_1bar_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.idNULL ,因为我们只想要不相关的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM