查询中带年份的算术表达式问题

2024-10-01 22:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

django在使用ExtractYear()的简单算法时,似乎没有创建正确的MySQL查询。你知道吗

我有一个带有两个数据字段的模型:

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

如果我想找到所有行,使开始日期和结束日期的年份相等,我可以这样做:

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')+Value(1)替换F('year')+1,但没有用。你知道吗

  1. 我是哪里错了,还是看起来像是django的虫子?

  2. 我也会很感激如果你看到任何其他方法做同样的!


Tags: djangofromeventdatemodelsmysqlextractyear
2条回答

这个问题似乎是正确的。你知道吗

但是,另一种查询在我的案例中起了作用:

Event.objects.annotate(s_year=ExtractYear(F('start_date')), f_year=ExtractYear(F('finish_date')), diff=F("f_year")-F("s_year")).filter(diff=1).only('pk')

只是注释了开始日期、结束日期和差异

这就是最终成功的原因:

Event.objects.annotate(diff=ExpressionWrapper(ExtractYear(F('finish_date'))-ExtractYear(F('start_date')), output_field=IntegerField())).filter(diff=1).only('pk').query

看起来django有个虫子。我把它添加到https://code.djangoproject.com/ticket/30494。你知道吗

相关问题 更多 >

    热门问题