【问题标题】:Filtering django DatetimeField__date not working过滤 django DatetimeField__date 不起作用
【发布时间】:2017-07-30 18:44:38
【问题描述】:

根据 v1.9 中添加的 document,我们可以按日期查询 DateTimeField 而无需时间。

例如:

Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

但这对我不起作用:

class MilkStorage(models.Model):
    ....

    created_at = models.DateTimeField(null=False)

用法

from datetime import date
MilkStorage.objects.filter(created_at__date=date.today())

它返回一个空查询集<QuerySet []>

此查询是否仅适用于 PostgreSQL?我正在使用MySQL

【问题讨论】:

  • 你说得对,它也不适用于我的应用程序,也不适用于 @mohammed-shareef-c 建议。
  • 是的,我想我需要在 github 上提出一个关于此的问题
  • 对不起,我没有正确测试。它适用于我的情况。也许你今天没有创建任何MilkStorage,那是我犯的错误。
  • 它确实对我有用,我用今天的日期创建了MilkStorage

标签: django django-models


【解决方案1】:

如果您使用的是 MYSQL 数据库,您可能需要执行以下操作: 使用mysql_tzinfo_to_sql https://dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html加载时区表

【讨论】:

    【解决方案2】:

    根据您的具体要求,这可能是也可能不是理想的解决方案。我发现如果您在 settings.py 中设置 USE_TZ = False,__date 就可以工作

    在禁用 USE_TZ 之前,我遇到了同样的问题(我什至无法按 __month 或 __day 过滤)。同样,可能不适合您的情况,但它应该让 __date 再次工作。

    【讨论】:

    • 确认这是我的情况,如果你有 USE_TZ = true,那么 __date 过滤器不起作用。
    • 我也确认了这一点,但还有其他选择吗?
    • 请参考此文档docs.djangoproject.com/en/3.2/ref/models/querysets/#date 当USE_TZ 为True 时,字段在过滤前转换为当前时区。这需要在数据库中定义时区。
    • 这里也一样。我猜__date 应该在USE_TZ=True 时将DateTimeField 值转换为指定的服务器时区后使用日期部分,但它不起作用。现在我使用了__contains__startswith 的解决方法,但不是理想的解决方案。
    【解决方案3】:

    我有一个访客模型。在这个模型中,我通过日期而不是时间过滤数据并且它正在工作。

    models.py

    Visitor(models.Model):
        timestamp = models.DateTimeField(_('Login Date Time'), auto_now=True)
        os_info = models.CharField(_('OS Information'), max_length=30, null=True)
    

    views.py

    import datetime      
    visitor = Visitor.objects.filter( timestamp__lte=datetime.datetime.now().date())
    print visitor 
    

    输出:

    <Visitor: Windows 10>, <Visitor: Windows 10>]
    

    使用上述方式从日期过滤数据。

    【讨论】:

    • 但是没有__lte可以过滤吗?
    • 如果没有__lte,您必须附加__date 才能完全匹配。
    猜你喜欢
    • 2016-10-08
    • 2018-02-09
    • 2018-12-14
    • 2014-10-10
    • 2016-04-13
    • 2016-01-10
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多