DJANGO - " hour_gte"过滤器的例外情况和" hour_lte" - 不支持的查询'小时'对于DateTimeField或在不允许的字段上加入

时间:2017-11-04 10:23:09

标签: python django django-orm

这是我的django模型:

class Readings(models.Model):
       val = models.FloatField(default=0)
       created_dt = models.DateTimeField()

现在我想选择2个日期之间的行,称为start_dateend_date,并且对于每个日期,我只想在特定时间范围内选择行(例如04:00-10:00)。

我有以下参数 -
start_date(datetime object)示例" 2017-08-04 18:30:00"
结束日期(日期时间对象)
start_hour(整数) end_hour(整数)

我的查询  Readings.objects.filter(created_dt__gte=start_date,created_dt__lte=end_date, created_dt__hour__gte= start_hour, created_dt__hour__lte=end_hour)
但它引发了一个名为不支持的查找'小时'对于DateTimeField或在不允许的字段上加入

4 个答案:

答案 0 :(得分:1)

我建议在一个timezone / datetime对象中定义日期和时间,并相应地过滤对象。我使用__range来实现结果,可能效率更高,因为在一个查询中,您将获取所有需要的信息:

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一次并返回该日期时间范围内的所有值。

希望它有所帮助。

答案 1 :(得分:0)

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

希望这有效

答案 2 :(得分:0)

在您的设置中使用USE_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)

请注意,开始日期和日期是本地化日期时间(不是日期)。此外,根据doc__hour和朋友在USE_TZ = True时使用本地时区。

答案 3 :(得分:0)

我喜欢使用Django作为Web服务器+ Gunicorn + Nginx。我为一些复杂的基于后端的Web服务做了什么,我通常使用SQL请求与db(MariaDb,Mysql,PostGreSql ..)交谈。我更喜欢这个老实说,我不能使用那个django管理面板来做有成效的事情。无论如何,我喜欢使用python Arrow lib。如果你有时间我会建议:

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

        select created_dt from Readings 
where created_dt between '2011/02/25' and '2011/02/27 23:59:59.999'

2)你可以导入箭头,它可以让你在玩日期时更轻松,例如:

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]

提醒您,如果要按名称调用获取字段数据,则需要将dico = True与正确版本的MySql连接器一起使用,例如(your_result [' My_field_name '])< / p>

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