如何使用Django F表达式仅过滤datetime字段的日期部分

3

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

F表达式似乎不会格式化字段。

我的模型是:

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

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

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

它一直在比较日期时间,而我只想比较日期。作为 Django 新手,我找不到解决方案。 我使用了时区和 MySQL,并且不想修改它们。

1个回答

1

您可以使用__date字段查找来完成此操作。

在您的情况下:

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

我能为您提供所需的结果。

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

但请确保您使用的是 Django>1.9,对于旧版本的 Django,您需要使用其他方法。


直到Django-2.2版本,不支持使用F('date1__date')语法。此外,这个问题已经有人问过了:https://dev59.com/glcP5IYBdhLWcg3ww8mS - imposeren
@imposeren,您能否提供您所说的声明的参考资料?我在Django 2.1中也使用了F('date1__date')进行交叉检查。您能解释一下这是如何实现的吗? - Sanip
抱歉,看起来我把它与“QuerySet.order_by()和distinct(*fields)现在支持使用字段转换。”搞混了。但是在我使用django 2.0.11的一个项目中,在F-expression内部仍然无法正常工作...很奇怪。 - imposeren
在发布这个答案之前,我已经进行了测试。 :) 此外,这个问题不是重复的,因为 OP 需要根据“日期”而不是“年份”、“秒数”或“月份”来过滤 queryset。 - Sanip
1
谢谢大家,__date 对我来说不起作用,因为我需要使用时区和 Mysql,并且我不想修改数据库。 - Scheinin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接