Фильтр Django по нескольким фильтрам, проверяя определенные условия - PullRequest
0 голосов
/ 13 сентября 2018

Мне нужно проверить ряд условий и выполнить фильтр ИЛИ поиск, если условия указаны.Я делаю это, как показано ниже:

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

В чем проблема в двух методах, которые я пробовал?Можете ли вы предложить минималистичное решение?

1 Ответ

0 голосов
/ 13 сентября 2018

В 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(),
)
...