【问题标题】:In Django filter statement what's the difference between __in and equal sign (=)?在 Django 过滤器语句中,__in 和等号 (=) 有什么区别?
【发布时间】:2016-03-05 18:32:05
【问题描述】:

关注this question,想知道写法有什么不同

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

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

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

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

【问题讨论】:

  • 联赛是多对多场?

标签: python django


【解决方案1】:

在不知道模型上定义的关系的情况下,我们无法确定。我可以给你的是一种检查查询的方法,它会确定它们是否等效:

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

并查看生成的 sql 以了解 db 级别的实际情况。

【讨论】:

  • 我已经使用了这个方法并且看到生成的查询是相同的,尽管league 是一个外键。也许在某些情况下它是不同的,而在某些情况下它是相同的?不过,您的回答解决了任何可能的进一步问题。非常感谢!
  • 我正在尝试查找添加了此“功能”的票证。请问您使用的是哪个版本的django?早期版本可以尝试将列表 [1,2,3] 转换为整数,当然在这里失败。
  • 我错了。如果你提供一个列表(就像我在我的问题中所做的那样)它不起作用:如果你提供一个 Python 列表,你必须使用“__in”。但是,如果您提供 Django QuerySet,它确实有效。在这种情况下,您可以同时使用“__in”和“=”,它们的结果相同。
【解决方案2】:

我大致认为您的第一个查询是这样的:

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)

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2019-05-01
    • 2011-09-23
    • 2019-05-01
    • 2019-02-11
    • 2015-04-18
    • 2019-03-12
    • 2012-03-31
    • 2012-01-24
    相关资源
    最近更新 更多