在Django过滤器语句中__in和等号(=)之间的区别是什么?

时间:2015-12-01 18:07:08

标签: python django

关注this question,我想知道写作是否有任何区别

.filter(league_pk__in=[1,2,3])

.filter(league=[1,2,3])

我已经尝试了两种方法,它们似乎在我的代码中返回了相同的结果,但在文档中没有任何地方说它们是相同的(as with __exact)。

我可以安全地假设这两种形式是平等的吗?它在哪里记录?

2 个答案:

答案 0 :(得分:5)

在不知道模型上定义的关系的情况下,我们无法肯定地说出来。我可以给你的是一种检查查询的方法,它会告诉你它们是否相同:

print your_qs.filter(league_pk__in=[1,2,3]).query
print your_qs.filter(league=[1,2,3]).query

然后查看生成的sql,了解db级别的实际情况。

答案 1 :(得分:0)

我认为大致是第一次查询,它正在做:

SELECT * FROM model WHERE model.league_id IN (SELECT id FROM league WHERE id IN(1, 2, 3))

对于第二个查询,它正在执行:

SELECT * FROM model WHERE model.league_id IN (1, 2, 3)