使用 Django 选择不在另一个表中的值

Posted

技术标签:

【中文标题】使用 Django 选择不在另一个表中的值【英文标题】:Select values which not in another table with Django 【发布时间】:2012-12-15 20:27:54 【问题描述】:

如何将这个 SQL 查询转换为 Django ORM 语句?

SELECT field1, field2, field3
FROM table1
WHERE field1 NOT IN 
(SELECT 2_field1 FROM table2);

请帮忙! :)

pstable1table2 不受 ForeignKeyManyToMany 的限制

【问题讨论】:

如果记录太多,在原始方法中使用该查询会导致管道损坏 【参考方案1】:

使用两个QuerySet,如图in the docs。

inner_qs = table2.objects.all()
results = table1.objects.exclude(field1__in=inner_qs)

【讨论】:

感谢您的链接,永远不要使用 API 到达页面的这一部分 :) 但是 - 这种方法效率不高。在我的情况下,通过 Django 的原始 SQL 需要 0.5 秒(包括fetchall()),嵌套查询的方法需要 5 秒 我经常发现原始 sql 对于这样的事情要快得多……尤其是如果 inner_qs 很大……但是如果有的话,可能有一种方法可以与原始 sql 等效是不是我没找到... 略有改进;在某些情况下,这会有所不同:inner_qs = table2.objects.values_list('field1',flat=True) results = table1.objects.exclude(field1__in=inner_qs) 虽然,如果您想更快地进行查询,您应该使用 QuerySet 方法raw()

以上是关于使用 Django 选择不在另一个表中的值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:如何在值列表中选择不在表中的值?

Mysql:从一个表中选择不在另一个表中的行

从表中的多个值中选择不在数组中的位置

从一个表中选择一个逗号分隔的值,并使用 SQL Server 中的函数在另一个表中的 where 条件中使用它

mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择

雪花数据库:想要使用表中列的值作为另一个表的选择语句中的列名