django: Почему я не могу использовать поиск __year внутри выражения F ()? - PullRequest
0 голосов
/ 16 мая 2019

Предположим, у меня есть модель с двумя DateField:

class Event(models.Model):
    start_date = models.DateField()
    finish_date = models.DateField()

Это позволяет мне создавать запросы, сравнивающие эти поля, например

ee=Event.objects.filter(finish_date=F('start_date'))

и я могу иметь дело с годом даты, например

ee=Event.objects.filter(finish_date__year=2000)

но когда я пытаюсь использовать тот же поиск __year внутри F(), вот так:

ee=Event.objects.filter(finish_date__year=F('start_date__year'))

, не получается:

FieldError: Cannot resolve keyword 'year' into field. Join on 'start_date' not permitted.

Есть ли причина для такого поведения или это похоже на ошибку?

Я использую Django 1.11, и не вижу таких ограничений на https://docs.djangoproject.com/en/1.11/topics/db/queries/#using-f-expressions-in-filters.

1 Ответ

2 голосов
/ 16 мая 2019

Вы пробовали это?

from django.db.models.functions import ExtractYear
from django.db.models import F

Event.objects.annotate(finish_date_year=ExtractYear(F('finish_date'))).filter(start_date__year=F('finish_date_year'))

Почему F('start_date__year') не работает?

Из Док Джанго,

Объект F() представляет значение поля модели или аннотированного столбца .

Итак, выражение start_date__year не является полем модели или аннотированным столбцом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...