1

我正在尝试使用 Django 从 sqlite 数据库中查询数据。

该模型

class SolarEntryHour(models.Model):
    time = models.DateTimeField()
    device = models.ForeignKey(Device)
    lW = models.DecimalField(max_digits=9, decimal_places=3)

    class Meta:
        unique_together = (("time", "device"))

我如何尝试访问数据

start = datetime.datetime.utcnow()+relativedelta(hour=0, minute=0, second=0, microsecond=0)
end = datetime.datetime.utcnow()

ticks = SolarEntryHour.objects.filter(
    time__range=(start, end), 
    device = str(deviceID)
)

发生了什么

Exception Value:    
list index out of range
Exception Location: /usr/lib/python2.7/dist-packages/django/db/backends/util.py in typecast_timestamp, line 97

异常似乎发生了,当查询实际执行时(在迭代“滴答声”时)Django尝试执行查询,并且输出print start; print end看起来很好

2013-01-01 00:00:00 - 2013-01-01 20:47:24.245942

SELECT "charts_solarentryhour"."id", "charts_solarentryhour"."time", "charts_solarentryhour"."device_id", "charts_solarentryhour"."lW" 
FROM "charts_solarentryhour" 
WHERE ("charts_solarentryhour"."device_id" = 1  AND "charts_solarentryhour"."time" 
BETWEEN 2013-01-01 00:00:00 and 2013-01-01 20:47:24.245942)

编辑:
我想我找到了问题,但我不知道这是预期的行为还是 Django Bug。

表“charts_solarentryhour”的“时间”字段定义为:
time = models.DateTimeField()
该表由数据库触发器填充,没有向该字段输入完整的日期时间,soleystrftime('%Y-%m-%d %H', 'now')

当 Django 然后执行查询时,在解析查询结果时失败,因为从数据库返回的字符串中没有分钟和秒(这就是抛出列表索引超出范围异常的原因)

不填充整个日期时间字段是一种不好的做法吗?
Django不应该能够添加一些零吗?
有没有什么好的方法可以解决这个问题而不会退回到原始查询执行?

4

2 回答 2

0

不是 Django 的问题 是 dateutil 的 relativedelta 函数的奇怪行为

您必须编写以下内容:

开始 = datetime.datetime.utcnow()+relativedelta(hours=0,minutes=0,seconds=0,microseconds=0)

并不是

开始 = datetime.datetime.utcnow()+relativedelta(hour=0,minute=0,second=0,microsecond=0)

小时更改替换(因此不添加)初始值

>>>import datetime
>>>from dateutil.relativedelta import relativedelta
>>>t1 = datetime.datetime.utcnow()
>>>t1 
datetime.datetime(2013, 11, 20, 18, 55, 11, 895897)
>>>t2 = t1 + relativedelta(hour=1, minute=3, second=7, microsecond=1) 
>>>t2
datetime.datetime(2013, 11, 20, 1, 3, 7, 1)
>>>t3 = t1 + relativedelta(hours=1, minutes=1, seconds=1, microseconds=1) 
>>>t3
datetime.datetime(2013, 11, 20, 19, 56, 12, 895898)
于 2013-11-20T19:10:41.210 回答
0

问:不填充整个日期时间字段是一种不好的做法吗?

是的 - 有很多工具可以愉快地解析格式良好的标准日期格式。因此,当您发明自己的格式时,预计会发生不好的事情。Django 和几乎所有框架都希望您使用标准字段类型的既定约定。

问:Django 不应该能够添加一些零吗?

不——这将是黑魔法。“2013-01-10 10”没有常规意义。

问:有什么好的方法可以解决这个问题,而不会退回到原始查询执行?

是的 - 在此处查看答案:DateTimeField 的格式

于 2013-10-11T06:04:14.837 回答