比较来自 DateTimeField/DateField Django ORM 的年份
Compare year from DateTimeField/DateField Django ORM
我的模型配置如下,
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
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 返回了空 QuerySet
。
有什么解决办法?
我们可以使用ExtractYear()
db function从DateTimeField
中提取Year
并使用annotate()
函数来临时存储它。然后将注释字段与年份查找进行比较。
from django.db.models import F
from django.db.models.functions import ExtractYear
Foo.objects.annotate(start_year=ExtractYear(F('start'))).filter(<b>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'))
我的模型配置如下,
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
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 返回了空 QuerySet
。
有什么解决办法?
我们可以使用ExtractYear()
db function从DateTimeField
中提取Year
并使用annotate()
函数来临时存储它。然后将注释字段与年份查找进行比较。
from django.db.models import F
from django.db.models.functions import ExtractYear
Foo.objects.annotate(start_year=ExtractYear(F('start'))).filter(<b>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'))