Django:按小时范围过滤数据的查询

sczxawaw  于 2023-06-07  发布在  Go
关注(0)|答案(2)|浏览(155)

我正在尝试运行一个查询,以获取从A小时到B小时的所有记录(例如:23-00小时范围内保存的所有记录。)
我尝试使用date__range,当然它没有帮助
这里的风景

def issue_report(request, pk):
try:
    issue = Issue.objects.get(id = pk)
    start = issue.date_time
    end = issue.date_time + timedelta(minutes=30)

    if issue.merge == '2':
        pass
    else:
        
        issue = Issue.objects.filter(date__range = (start, end), customer = issue.customer.id, merge = '2').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, date__range = (start, end), merge= '1', ).order_by('date_time')], 
        key=attrgetter('date_time')
    )

    for tx in transactions.copy():
        if tx.date_time < issue.date_time:
            transactions.remove(tx)

    transactions.insert(0, issue)

    return render(request, 'issue/report.html', context={'issue':issue, 'transactions':transactions ,'hijri':hijri})  
except AttributeError:
    return HttpResponse("<h1>Change Transaction type to ``Don't Merge``.</h1>")
x6492ojm

x6492ojm1#

要根据特定的小时范围筛选记录,可以使用日期/时间对象的hour属性,并将其与gte和lt查找组合在一起。例如,要获取从晚上11点到午夜的所有记录,您可以执行以下操作:

from datetime import time

start_time = time(hour=23)
end_time = time(hour=0)

records = MyModel.objects.filter(
    my_datetime_field__time__gte=start_time, my_datetime_field__time__lt=end_time
)

这将为您提供my_datetime_field的时间在11 PM(23:00:00)和午夜(00:00:00)之间的所有记录。请注意,我们使用lt表示结束时间,因为从技术上讲,午夜是新一天的开始。
在您的代码中,您可以修改事务查询以基于小时范围进行筛选,如下所示:
enter image description here
这将为您提供在问题数据时间后30分钟内发生的所有交易。注意,我还简化了列表解析,因为它只包含一个模型类。
我希望这对你有帮助!

46scxncf

46scxncf2#

对于简单的范围,Django过滤器可以原生处理。有关小时和分钟过滤器,请参阅文档
从晚上11点到午夜,你可以简单地使用

issue = Issue.objects.filter(
        #This will capture items from 11pm to midnight
        date_time__hour = 23, 
        customer = issue.customer.id, 
        merge = '2'

    ##you could also refine to the first half hour using exclude.
    #).exclude(
    #    date_time__minute__gt=31
    ).order_by('date_time').first()

如果要获取基于另一项中变量值的范围(包括超过一小时的时间段),则可能需要为此目的设置一个单独的时间字段,如this answer中所述

相关问题