Почему Model.objects.filter возвращает пустой запрос?
Я читаю статью по django о том, как делать запросы через здесь. У меня есть следующие фрагменты
>>> Entry.objects.first().pub_date
datetime.date(2021, 8, 18)
>>> Entry.objects.first().mod_date
datetime.date(2021, 8, 18)
Но если я попробую следующее, то получу пустой набор запросов.
Entry.objects.filter(pub_date__year=F('mod_date__year'))
Почему не работает. Это ошибка?
Похоже, django обрабатывает __year
и другие __
извлечения даты по-другому с помощью выражений annotate или F, по сравнению с использованием их в фильтре.
Например, в Postgres запрос, сгенерированный с помощью filter(pub_date__year=F('mod_date__year'))
, выглядит так:
WHERE EXTRACT(\'year\' FROM pub_date") = ("mod_date")
, что приведет к ошибке. Но если использовать целочисленный год, например filter(pub_date__year=2021)
:
WHERE "pub_date" BETWEEN 2021-01-01 AND 2021-12-31'
ИСПОЛЬЗОВАНИЕ ЭКСТРАКТА:
Чтобы решить эту проблему, попробуйте использовать Extract
для генерации правильного фильтра:
from django.db.models.functions import Extract
Entry.objects.filter(pub_date__year=Extract('mod_date', 'year'))
В результате будет сформирован следующий запрос:
WHERE EXTRACT(\'year\' FROM "pub_date") = (EXTRACT(\'year\' FROM "mod_date"))'