从DateTimeField / DateField Django ORM比较年份

时间:2019-05-17 04:42:31

标签: django django-models django-orm django-database-functions

我的模型配置如下,

class Foo(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()

如何检索同年 Foo 实例?


不成功的尝试:

from django.db.models import F

Foo.objects.filter(start__year=F('end__year'))

返回空的 QuerySet

1 个答案:

答案 0 :(得分:2)

Foo.objects.filter(start__year=F('end__year'))语句的SQL查询是

SELECT "foo"."id", "foo"."start", "foo"."end" FROM "foo" WHERE django_datetime_extract('year', "foo"."start", 'UTC') = ("foo"."end")

看..?比较发生在整数(提取的start year)和日期时间(end datetime之间。

因此,Django返回了空的 QurySet


有什么解决方案?

我们可以使用ExtractYear() db functionYear提取 DateTimeField 并使用 annotate() 函数临时存储它。然后将 带注释的字段 年份查询

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

Foo.objects.annotate(start_year=ExtractYear(F('start'))).filter(end__year=F('start_year'))

SQL查询

SELECT "foo"."id", "foo"."start", "foo"."end", django_datetime_extract('year', "foo"."start", 'UTC') AS "start_year" FROM "foo" WHERE django_datetime_extract('year', "foo"."end", 'UTC') = (django_datetime_extract('year', "foo"."start", 'UTC'))