我的模型配置如下,
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
答案 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 function从Year
提取 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'))