Django过滤器由多个过滤器组成,检查特定条件

2024-04-23 19:48:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检查一些条件,并做一个过滤器或搜索,如果条件是指定的。我是这样做的:

def or_q_if_truthfull(**kwargs):
    filtered = [Q(**{k: v}) for k, v in kwargs.items() if v]
    if filtered:
        return reduce(or_,filtered)
    else:
        return Q()
def check():        
    if age.isdigit():
        my_q = or_q_if_truthfull(
            name__lower__contains=name.lower(),
            age=age,
            mobile__contains=phone,
            email__lower__contains=email.lower(),
            address__lower__contains=address.lower(),
            city__lower__contains=city.lower(),
        )
    else:
        my_q = or_q_if_truthfull(
            name__lower__contains=name.lower(),
            mobile__contains=phone,
            email__lower__contains=email.lower(),
            address__lower__contains=address.lower(),
            city__lower__contains=city.lower(),
        )

我试着把if和else组合成一个块:

方法1:

my_q = or_q_if_truthfull(
    name__lower__contains=name.lower(),
    age=age if age.isdigit(),
    mobile__contains=mobile,
    alternate__contains=alternate,
    email__lower__contains=email.lower() if email else email,
    address__lower__contains=address.lower(),
    city__lower__contains=city.lower(),
)

File "/home/joel/myappointments/clinic/views.py", line 97
age=age if age.isdigit(),
                        ^
SyntaxError: invalid syntax

然后我尝试了这个:

方法2:

from numbers import Number
my_q = or_q_if_truthfull(
    cstid=HospitalID,
    name__lower__contains=name.lower() if name else name,
    age=age if isinstance(age, Number),
    mobile__contains=mobile,
    alternate__contains=alternate,
    email__lower__contains=email.lower() if email else email,
    address__lower__contains=address.lower(),
    city__lower__contains=city.lower(),
)

File "/home/joel/myappointments/clinic/views.py", line 97
    age=age if isinstance(age, Number),
                                    ^
SyntaxError: invalid syntax

我试过的两种方法有什么问题?你能提出一个最低限度的解决方案吗?你知道吗


Tags: ornamecityageifaddressemailmy
1条回答
网友
1楼 · 发布于 2024-04-23 19:48:24

在python中,可以使用None关键字使变量不包含任何值。你知道吗

对于合并,可以使用以下方法:

my_q = or_q_if_truthfull(
    name__lower__contains=name.lower(),
    age=age if age.isdigit() else None,
    mobile__contains=phone,
    email__lower__contains=email.lower(),
    address__lower__contains=address.lower(),
    city__lower__contains=city.lower(),
)

相关问题 更多 >