Python Peewee 动态构建查询

问题描述 投票:0回答:1

我有一些这样的模型:

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)

动态应用附加过滤器的地方

我怎样才能实现这个或类似的目标

感谢您的帮助!

python python-3.x peewee
1个回答
0
投票

您共享的代码应该可以工作,因为您正在逐步向查询添加其他过滤器。是不是因为某种原因不起作用?

不过,更一般地说,您可以在列表中累积表达式,然后减少它们并将它们传递给

.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))
© www.soinside.com 2019 - 2024. All rights reserved.