Django:过滤日期之间的数据 | DatetimeField 收到一个天真的日期时间
Django: Filter data between to dates | DatetimeField received a naive datetime
我只是想过滤我在两个日期之间的记录。
假设有一条记录 table Measurements
具有 属性 timestamp
:
class Measurements(models.Model):
id = models.BigAutoField(primary_key=True)
timestamp = models.DateTimeField()
当我查看最后一条记录的 timestamp
时 Measurements.objects.last().timestamp
它 returns:
datetime.datetime(2020, 10, 13, 6, 29, 48, 90138, tzinfo=<UTC>)
现在我想过滤日期 from_date
和 to_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 中打印两个日期时,它 returns:
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_date
和 to_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=<b>(from_date, to_date)</b>
)
print(measurements.count())
我只是想过滤我在两个日期之间的记录。
假设有一条记录 table Measurements
具有 属性 timestamp
:
class Measurements(models.Model):
id = models.BigAutoField(primary_key=True)
timestamp = models.DateTimeField()
当我查看最后一条记录的 timestamp
时 Measurements.objects.last().timestamp
它 returns:
datetime.datetime(2020, 10, 13, 6, 29, 48, 90138, tzinfo=<UTC>)
现在我想过滤日期 from_date
和 to_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 中打印两个日期时,它 returns:
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_date
和 to_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=<b>(from_date, to_date)</b>
)
print(measurements.count())