django - 从 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
解决方案
语句的SQL查询Foo.objects.filter(start__year=F('end__year'))
是,
SELECT "foo"."id", "foo"."start", "foo"."end"
FROM "foo"
WHERE django_datetime_extract('year', "foo"."start", 'UTC') = ("foo"."end")
看..?比较发生在整数(提取的start year
)和日期时间(end datetime
)之间
所以,Django 返回了 empty QuerySet
。
解决方案是什么?
我们可以使用ExtractYear()
db 函数从中提取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(<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'))
推荐阅读
- angular - 优化大型数据集的性能
- spring - 我们可以使用 Shedlock 来锁定 API 调用吗
- c# - 关闭 XML 设置数据透视表报表布局为表格?
- sql - TSQL根据select语句的整数结果插入值
- c# - 为什么我收到错误 CS0119:'DragDrop' 是一种类型,在给定的上下文中无效
- design-patterns - 树数据结构和复合设计模式有什么区别?
- java - 使用 ByteArrayOutputStream 和 ZipOutputStream 将超过 200MB 的文件生成 ZIP 时遇到问题
- azure - 将数据从 SQL 数据库迁移到 Azure Cosmos DB 模拟器时,Cosmos 数据迁移工具引发错误
- c# - 缺少类型映射或不支持的映射
- c# - 使用 Oracle-To-SqlServer 迁移工具将存储过程从 Oracle 转换为 SQL Server