我有一些这样的模型:
class User(Model):
username = CharField()
email = CharField()
disabled = BooleanField()
admin = BooleandField()
...
我想写这样的查询:
def apply_filter(query, filter):
match filter:
case "disabled":
return query.where(User.disabled == True)
case "admin":
return query.where(User.admin == True)
case "protonmail":
return query.where(User.email % "%protonmail.com")
...
def get_users(filters):
results = []
try:
query = User.select()
for filter in filters:
query = apply_filter(query, filter);
for e in query:
results.append(e)
动态应用附加过滤器的地方
我怎样才能实现这个或类似的目标
感谢您的帮助!
您共享的代码应该可以工作,因为您正在逐步向查询添加其他过滤器。是不是因为某种原因不起作用?
不过,更一般地说,您可以在列表中累积表达式,然后减少它们并将它们传递给
.where()
:
def apply_filter(filter):
match filter:
case "disabled":
return (User.disabled == True)
case "admin":
return (User.admin == True)
case "protonmail":
return (User.email % "%protonmail.com")
...
from functools import reduce
import operator
def get_users(filters):
results = []
query = User.select()
exprs = [apply_filter(f) for f in filters]
# AND expressions together:
query = query.where(reduce(operator.and_, exprs))
# OR expressions together:
query = query.where(reduce(operator.or_, exprs))