这是我的django模型:
class Readings(models.Model):
val = models.FloatField(default=0)
created_dt = models.DateTimeField()
现在我想选择2个日期之间的行,称为start_date
和end_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或在不允许的字段上加入
答案 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类。 希望它有所帮助,祝你好运