簡體   English   中英

從 DateTimeField/DateField Django ORM 比較年份

[英]Compare year from DateTimeField/DateField Django ORM

我有一個模型配置如下,

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

如何檢索具有相同 Year 的Foo實例?


不成功的嘗試:

from django.db.models import F

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

returnd空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 函數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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM