Почему 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"))'
Вернуться на верх