Как складывать фильтры, если параметры существуют или нет?

Если у меня есть что-то вроде этого:

    tasks = Task.objects.filter( 
        Q(datetime__contains=date)
        & Q(user=uid) if uid!=0 else
        & Q(member=mid) if mid!=0 else
        & Q(job=jid) if jid!=0 else
    )

Он будет складывать/смешивать фильтры в зависимости от того, какие параметры функции переданы, но очевидно, что это не работает, какой лучший способ продолжить?

Вы можете цепочкой вызывать filter внутри операторов if для "укладки" условных фильтров

tasks = Task.objects.filter( 
    datetime__contains=date
)
if uid != 0:
    tasks = tasks.filter(user=uid)
if mid != 0:
    tasks = tasks.filter(member=mid)
if jid != 0:
    tasks = tasks.filter(job=jid)

Простым способом может быть распаковка словаря:

data = {'user': uid, 'member': mid, 'job': jid}

tasks = Task.objects.filter(
    **{ k: v for k, v in data.items() if v != 0 },
    datetime__contains=date
)
Вернуться на верх