繁体   English   中英

Django:过滤日期之间的数据 | DatetimeField 收到了一个天真的日期时间

[英]Django: Filter data between to dates | DatetimeField received a naive datetime

只是想在两个日期之间过滤我的记录。

假设有一个记录表Measurements具有属性timestamp

class Measurements(models.Model):
    id = models.BigAutoField(primary_key=True)
    timestamp = models.DateTimeField()

当我检查了timestamp的最后一条记录的Measurements.objects.last().timestamp返回:

datetime.datetime(2020, 10, 13, 6, 29, 48, 90138, tzinfo=<UTC>)

现在我想过滤日期from_dateto_date之间的数据。 根据之前关于这个问题的问题,我使用了make_aware 为了测试,我使用count来获取条目的数量。

from .models import *
from datetime import datetime
from django.utils.timezone import make_aware

def get_measurements(request):
    from_date = make_aware(datetime(2020, 10, 12, 15, 30, 0, 0))
    to_date = make_aware(datetime(2020, 10, 12, 16, 0, 0, 0))
    print(from_date)
    print(to_date)

    measurements = DriveMeasurements.objects.filter(
        plc_timestamp__range=["2020-01-01", "2020-01-31"])
    print(measurements.count())

在我的 shell 中打印两个日期时,它返回:

datetime.datetime(2020, 10, 12, 15, 30, tzinfo=<UTC>)
datetime.datetime(2020, 10, 12, 16, 0, tzinfo=<UTC>)

当我运行上面的函数时,Django 会触发以下消息:

RuntimeWarning:DateTimeField Measurements.timestamp 在时区支持处于活动状态时收到了一个朴素的日期时间 (2020-01-31 00:00:00)。 warnings.warn("DateTimeField %s 收到了一个天真的日期时间 (%s)"

打印语句print(measurements.count())打印0但数据库中有 ~ 18000 条记录。

那么为什么过滤器不起作用并且抛出了 Django 消息呢?

from_dateto_date知道确实是正确的,但是在__range检查中没有使用它。 您应该与:

def get_measurements(request):
    from_date = make_aware(datetime(2020, 10, 12, 15, 30, 0, 0))
    to_date = make_aware(datetime(2020, 10, 12, 16, 0, 0, 0))
    print(from_date)
    print(to_date)

    measurements = DriveMeasurements.objects.filter(
        #  use timezone aware datetimes ↓
        plc_timestamp__range=(from_date, to_date)
    )
    print(measurements.count())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM