Похоже, что django не создает правильный запрос MySQL при простой арифметике с ExtractYear ().
У меня есть модель с двумя полями данных:
class Event(models.Model):
start_date = models.DateField()
finish_date = models.DateField()
ЕслиЯ хочу найти все строки так, чтобы годы start_date и finish_date были равны, я могу сделать это так:
from django.db.models import F
from django.db.models.functions import ExtractYear
>>> print Event.objects.annotate(year=ExtractYear(F('start_date'))).filter(finish_date__year=F('year')).only('pk').query
SELECT `event`.`id`, EXTRACT(YEAR FROM `event`.`start_date`) AS `year` FROM `event` WHERE EXTRACT(YEAR FROM `event`.`finish_date`) = (EXTRACT(YEAR FROM `event`.`start_date`))
Но если я хочу найти события, которые начинаются и заканчиваются в последующие годы, я пытаюсьследующий фильтр, и он дает мне неправильный запрос MySQL:
>>> print Event.objects.annotate(year=ExtractYear(F('start_date'))).filter(finish_date__year=F('year')+1).only('pk').query
SELECT `event`.`id`, EXTRACT(YEAR FROM `event`.`start_date`) AS `year` FROM `event` WHERE `event`.`finish_date` BETWEEN 0001-01-01 AND 0001-12-31
Я пытался заменить F('year')+1
на F('year')+Value(1)
, но это не помогло.
Я где-то ошибаюсь или это похоже на ошибку в django?
Буду также признателен, если вы увидите какие-либо другие способы сделать то же самое!