如何在Python的Peewee ORM中使用`WHERE value IN list`进行查询?

23

我正在为我的Flask项目使用(很棒的)Python Peewee ORM,但现在我尝试使用 where value in ['a', 'b', 'c'] 进行查询时卡住了。我尝试按照如下方式执行:

MyModel.select().where(MyModel.sell_currency in ['BTC', 'LTC'])

但是不幸的是它返回了数据库中的所有记录。你有什么想法可以解决这个问题吗?

2个回答

47

文档中已经有了答案:x << y 将执行 x IN y,其中 y 是一个列表或查询。因此最终的查询将如下所示:

MyModel.select().where(MyModel.sell_currency << ['BTC', 'LTC'])


1
抱歉我的无知,我在发布这个问题后才发现它.. :S 无论如何还是非常感谢! - kramer65
6
Python总是将x in y的返回值强制转换为布尔类型,因此需要使用<<运算符。 - coleifer
@coleifer - 没有别的解决方法吗?虽然现在它可以工作,而且我能够记住下一次使用,但是使用 x in y 对于新手来说更加直观易懂。而直观的数据库使用正是 Peewee 优秀的地方之一.. (顺便感谢您创建的 peewee; 我已经使用了半年了,非常棒!) - kramer65
8
这是一个 Python 的特性,相信我,我更愿意使用 "in"。如果你想的话,也可以写成 MyModel.sell_currency.in_(['BTC', 'LTC']) - coleifer
你能否创建一种中间对象,实现类似于 Django F 和 Q 对象的 in 方法呢? - Stuart Axon

5
您可以使用子查询来执行“IN”表达式。例如,要获取用户名以“a”开头的用户:
a_users = User.select().where(fn.Lower(fn.Substr(User.username, 1, 1)) == 'a')
.in_() 方法表示一个 "IN" 查询。
a_user_tweets = Tweet.select().where(Tweet.user.in_(a_users))

请参见http://peewee.readthedocs.io/en/latest/peewee/query_operators.html

从peewee.py中,"in_ = _e(OP.IN)", "lshift = e(OP.IN)",我认为"in()"方法更有意义。感谢您的回答。 - MadHatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接