【问题标题】:Django filter by datetime month__gte is not working按日期时间月__gte过滤的Django不起作用
【发布时间】:2020-03-13 08:00:15
【问题描述】:

我正在使用 Django 2.2

我有一个 DateTime 类型的 created 字段。

我正在使用以下命令过滤大于特定日期的记录

q.filter(created__year__gte=2020, created__month__gte=3, created__day__gte=1)

在我的数据库中,有 3 月 (3) 个月及更多月份的记录,但没有 2 月 (2) 月份的记录。

执行上述命令时,它会为我提供大于 3 月 1 日 的数据的查询集列表。但是当我使用以下命令时

q.filter(created__year__gte=2020, created__month__gte=2, created__day__gte=28)

其中月份是二月 (2),它没有提供任何数据并且查询集是空白的。

使用datetime 对象会报错

received a naive datetime (2020-03-01 00:00:00) while time zone support is active

为什么即使月份小于3,过滤器也无法使用gte

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    用途:

    q.filter(created__date__gte=datetime.date(2020, 3, 1))
    

    关于过滤器,它在月份 28,那么它已经缩小的结果设置为仅在每个月的 29-31 天之间创建的数据,而不仅仅是 2 月。很可能不是你想要的。

    【讨论】:

    • 这不适用于新创建的对象。删除 date__ 会发出警告,但工作正常。
    【解决方案2】:

    为什么要这样过滤?在您的情况下,这是完全没有必要的。严格按日期过滤

    q.filter(created__gte=datetime.datetime(2020, 3, 1))
    

    【讨论】:

    • 因为启用了时区支持,使用 datetime 对象会出现naive-aware 错误。
    • @AnujTBE 然后使用 django.utils.timezone
    【解决方案3】:

    该错误与 Django 设置无关,而是与 MySQL 配置有关,因为缺少时区数据。

    查看此答案以了解如何解决此错误

    https://stackoverflow.com/a/60844090/3719167

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2014-03-12
      • 2014-03-22
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2018-01-25
      • 2023-03-23
      相关资源
      最近更新 更多