Python DJANGO-过滤条件异常;“小时”;及;小时不支持的查找';小时';不允许用于DateTimeField或在该字段上加入

Python DJANGO-过滤条件异常;“小时”;及;小时不支持的查找';小时';不允许用于DateTimeField或在该字段上加入,python,django,django-orm,Python,Django,Django Orm,这是我的django模型: class Readings(models.Model): val = models.FloatField(default=0) created_dt = models.DateTimeField() 现在我想选择两个日期之间的行,分别是start\u date和end\u date,对于每个日期,我只想选择特定时间范围内的行(如04:00-10:00) 我有以下参数- 开始日期(日期时间对象)示例“2017-08-04 18:30:00

这是我的django模型:

class Readings(models.Model):
       val = models.FloatField(default=0)
       created_dt = models.DateTimeField()
现在我想选择两个日期之间的行,分别是
start\u date
end\u date
,对于每个日期,我只想选择特定时间范围内的行(如
04:00-10:00

我有以下参数-
开始日期(日期时间对象)示例“2017-08-04 18:30:00”
结束日期(日期时间对象)
开始时间(整数) 结束时间(整数)

我的问题
reads.objects.filter(创建的时间=开始时间,创建的时间=结束日期,创建的时间=开始时间,创建的时间=结束时间)


但是它引发了一个异常,名为不支持DateTimeField的查找'hour',或者在不允许的字段上进行联接

我建议在一个时区/日期时间对象中定义日期和时间,并相应地筛选对象。我使用它来获得结果,可能会更有效,因为在一次查询中,您将获取所有所需信息:

from django.utils import timezone as tz
start_dt = tz.now()  # you should tune the value
end_dt = tz.now() + tz.timedelta(days=1)  # you should tune the value
Readings.objects.filter(created_dt__range=(start_dt, end_dt))
这将命中db一次并返回该日期时间范围内的所有值

希望能有帮助

Readings.objects.filter(created_dt__range=["YYYY-MM-DD HH:MM","YYYY-MM-DD HH:MM"])

希望这能在您的设置中使用_TZ=True并在本地时区解决您的问题,如果这是您想要的:

from django.utils.timezone import get_current_timezone

tz = get_current_timezone()
start_date = datetime.datetime(2017, 4, 5)
end_date = datetime.datetime(2017, 4, 11) # the day you want + 1
Readings.objects.filter(created_dt__gte=start_date,
                        created_dt__lt=end_date,
                        created_dt__hour__gte=4,
                        created_dt__hour__gte=10)

请注意,开始和日期是本地化的日期时间(而不是日期)。另外,
\uuuuuhour
和朋友在
使用z=True
时使用本地时区。

我喜欢使用Django作为Web服务器+Gunicorn+Nginx。对于一些复杂的基于后端的Web服务,我通常使用SQL请求与db(MariaDb、Mysql、PostGreSql..)交谈。我更喜欢这种方式,老实说,我不能用django管理面板来做有效率的事情。无论如何,对于约会,我喜欢使用。如果您有时间,我建议您:

1) 您设计的SQL代码(选择请求)应该是这样的

        select created_dt from Readings 
where created_dt between '2011/02/25' and '2011/02/27 23:59:59.999'
2) 您可以导入Arrow,它使您在玩日期游戏时的生活更轻松,例如:

import arrow
mydate = arrow.now().format('YYYY-MM-DD')
3) 使用SQL连接器并执行SQL请求:

import MySQLdb
myhost = 'xx.xx.xx.xx' # IP
myuser = 'xxxxxxxyour usernamexxxxxxxxxxxx'
mypassword = '****your pass***********'
sql = "select created_dt from Readings where created_dt between '2011/02/25' and '2011/02/27 23:59:59.999'"
db = 'your_database_name'
connection = MySQLdb.connect(myhost,myuser,mypassword,db,use_unicode=True, charset="utf8")
cursor = connection.cursor()
cursor.execute(sql) # your results are in the cursor
#connection.commit() # you don't need this
connection.close
for your_result in cursor[0]:
    mydate = your_result[0]
提醒一下,如果您想按名称调用get fields data,您需要在MySql连接器的正确版本中使用dico=True,例如(您的_结果['My_field_name'))

如果正在显示数据,则将在Django项目中重新编码View.py类。
希望有帮助,祝你好运

嗨R8B8m,欢迎来到SO。您的代码示例不是独立的,您无法运行它并重现您的问题,因为未提供
model
。看一看:@snake\u charmer谢谢,我已经在描述中提供了我的django模型,我还应该提供什么吗?谢谢你的回答,但这不只是按2个日期范围过滤吗?对于两个日期范围之间的所有日期,我只想选择一些开始和结束时间之间的行。例子。假设我有以下数据2017-10-20 05:30:00 2017-10-20 06:30:00 2017-10-20 07:30:00 2017-10-20 08:30:00 2017-10-29 09:30:00 2017-10-29 10-29 10:30:00 2017-10-30 05:30:00 2017-10-30 06:30:00 2017-10-30 07:30:00 2017-10-30-30:00 2017-10-30 09:30:00如果我只想要数据,谢谢你的回答,但我想知道我想这些只会过滤2个时间范围内的日期,而不会根据小时进行过滤。谢谢你的回答,这非常有帮助,但我一直在寻找django queryset。谢谢你的回答,这正是我试图做的,但它引发了一个例外:“不允许对DateTimeField或该字段上的join进行不支持的“小时”查找。”