Django Фильтр на основе 2 полей

У меня есть модель, в которой я могу установить дату истечения срока действия_1 и дату истечения срока действия_2. И 2 фильтра вроде этого.

filter_1 = Q(expire_date_1__isnull=False) & Q(expire_date_1__lte=after_30days) 
filter_2 = Q(expire_date_2__isnull=False) & Q(expire_date_2__lte=after_30days)

Я хочу отфильтровать модель так, чтобы если expire_date_2 не null, то использовать filter_2, иначе использовать filter_1. Я пытался сделать это с помощью Case и When, но я не могу фильтровать в функции When, не так ли?

Вы можете работать с Coalesce [Django-doc], чтобы определить, какое поле использовать:

from django.db.models import Coalesce

MyModel.objects.alias(
    exp_date=Coalesce('expire_date_2', 'expire_date_1')
).filter(
    exp_date__lte=after_30_days
)

или до с .annotate(…):

from django.db.models import Coalesce

MyModel.objects.annotate(
    exp_date=Coalesce('expire_date_2', 'expire_date_1')
).filter(
    exp_date__lte=after_30_days
)
Вернуться на верх