Django按小时范围过滤数据的查询问题及代码求助
解决指定小时范围(跨天)的记录查询问题
你用date__range无效的核心原因是:这个参数是按完整日期时间区间过滤,而你要的是固定小时段(比如23:00-00:00)的记录,尤其是跨天场景,date__range无法直接实现仅按小时筛选的需求。
解决方案
针对跨天的小时范围查询,需要用Django的Q对象实现或条件筛选,分两种情况匹配记录:
- 小时数大于等于23的当天记录
- 小时数小于1(即0点)的次日记录
以下是修改后的视图代码(以23点至0点的需求为例):
def issue_report(request, pk): try: issue = Issue.objects.get(id=pk) # 若需固定23-0点区间,可替换原有start/end逻辑;若需保留基于issue.date_time的30分钟范围,可叠加日期条件 if issue.merge == '2': pass else: issue = Issue.objects.filter( customer=issue.customer.id, merge='2', # 核心:筛选23点或0点的记录 Q(date_time__hour__gte=23) | Q(date_time__hour__lt=1) ).order_by('date_time').first() a = issue.date x = int(a.strftime('%Y')) y = int(a.strftime('%m')) z = int(a.strftime('%d')) hijri = Gregorian(x, y, z).to_hijri() dbs = [Issue] transactions = sorted( [m for db in dbs for m in db.objects.filter( customer=issue.customer.id, merge='1', # 给交易记录同样加上小时筛选 Q(date_time__hour__gte=23) | Q(date_time__hour__lt=1) ).order_by('date_time')], key=attrgetter('date_time') ) # 保留原有的时间过滤逻辑(仅保留晚于issue.date_time的记录) transactions = [tx for tx in transactions if tx.date_time >= issue.date_time] transactions.insert(0, issue) return render(request, 'issue/report.html', context={'issue': issue, 'transactions': transactions, 'hijri': hijri}) except AttributeError: return HttpResponse("<h1>将交易类型改为“不合并”。</h1>")
关键说明
date_time__hour是Django ORM针对datetime字段的内置查找器,可直接提取小时部分做筛选;- 若需同时限制日期范围(比如近7天内的23-0点记录),可叠加
date__range条件,用&和Q对象组合:Q(date__range=(start_date, end_date)) & (Q(date_time__hour__gte=23) | Q(date_time__hour__lt=1))
内容的提问来源于stack exchange,提问作者pip install logic
相关产品推荐
相关产品推荐

