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
)
или до django-3.2 с .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
)