如何使用 django F 表达式仅过滤日期时间字段的日期

Posted

技术标签:

【中文标题】如何使用 django F 表达式仅过滤日期时间字段的日期【英文标题】:How to use django F expressions to only filter the date of datetime fields 【发布时间】:2019-10-02 02:58:14 【问题描述】:

我需要通过日期时间字段过滤另一个日期时间字段,但我只需要比较日期。 F表达式如何实现?

F 表达式似乎没有格式化字段

我的模型是:

class Test():
   date1 = models.DateTimeField()
   date2 = models.DateTimeField()

我只需要比较日期,而不是时间。

Test.objects.filter(Q(date2__gt=F('date1')))

它不断比较日期时间。那不是我想要的。我只是想比较日期。作为一个Django菜鸟,我找不到解决办法。 我用的是时区和mysql,不想修改。

【问题讨论】:

Django F expression on datetime objects的可能重复 【参考方案1】:

您可以为此使用__date 字段查找。

在你的情况下:

Test.objects.filter(Q(date2__date__gt=F('date1__date')))

可以给你想要的结果。

__date 字段查找有助于仅从日期时间字段中提取日期。

但是要确保你使用的是Django>1.9,对于老版本的Django,你需要使用其他方法

【讨论】:

F('date1__date') 在 Django-2.2 之前不受支持。而且这个问题是重复的:***.com/questions/43890131/… @imposeren 您能否为您的陈述提供参考?我也在 Django 2.1 中使用了F('date1__date') 进行交叉检查。你能解释一下这是怎么可能的吗? 对不起,好像我把它和“QuerySet.order_by() 和 distinct(*fields) 现在支持使用字段转换。”混淆了。但由于某种原因,在我使用 django 2.0.11 的一个项目中,它在 F-expression 内部不起作用......奇怪。 我在发布此答案之前对其进行了测试。 :) 此外,这个问题不是重复的,因为 OP 需要根据“日期”而不是“年”、“秒”或“月”过滤查询集。 谢谢各位,__date对我不起作用,因为我需要使用时区和Mysql,我不想修改数据库。

以上是关于如何使用 django F 表达式仅过滤日期时间字段的日期的主要内容,如果未能解决你的问题,请参考以下文章

Django 仅基于日期过滤日期时间

如何在 Django F 表达式中将日期和时间字段合并到 DateTime 字段中

使用 F 和 Q 表达式进行 Django 模型过滤

如何使用时区感知日期过滤模型?

日期时间对象上的 Django F 表达式

Django - 如何使用 Django Rest Framework 按日期过滤?