如何使用 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 表达式仅过滤日期时间字段的日期的主要内容,如果未能解决你的问题,请参考以下文章