Django Query:如何从开始和结束时间字段中找到最长持续时间?
Posted
技术标签:
【中文标题】Django Query:如何从开始和结束时间字段中找到最长持续时间?【英文标题】:Django Query : how do I find the maximum time duration from start and end time fields? 【发布时间】:2017-01-05 21:56:25 【问题描述】:这是我的 Django 模型:
class Shift(models.Model):
worker = models.OneToOneField('Worker',null=True)
date = models.DateField(null=True)
shiftTime = models.CharField(max_length=10, default="N/A")
timeIn = models.TimeField(null=True)
timeOut = models.TimeField(null=True)
我需要找到在给定日期范围内在办公室工作时间最长的员工。如何从 Django 查询中的 timeIn 和 timeOut 字段计算持续时间?
编辑:我不想使用另一个属性 duration 因为这似乎是多余的。除了使用原始查询或持续时间属性之外,还有其他方法吗?
【问题讨论】:
Django Select Query Time Diff的可能重复 【参考方案1】:Django 1.10 通过 ORM 引入了natively do date/time diffs 的功能。此查询将为您提供最长的班次:
from django.db.models import DurationField, ExpressionWrapper, F
longest_shift = Shift.objects.annotate(shift_length=ExpressionWrapper(
F('timeOut') - F('timeIn'),
output_field=DurationField()))\.
order_by('-shift_length').first()
您可以根据需要通过在annotate()
之前添加filter()
子句来为特定日期范围添加过滤器。
【讨论】:
【参考方案2】:遍历对象并获得 timeIn 和 timeOut 之间的最大持续时间。
def get_largest_time_diff():
shift_objs = Shift.objects.all()
time_diff = 0
if shift_objs:
time_diff = shift_objs[0].timeOut - shift_objs[0].timeIn
for tm in shift_objs[1:]:
if time_diff < tm.timeOut - tm.timeIn:
time_diff = tm.timeOut - tm.timeIn
return time_diff
【讨论】:
以上是关于Django Query:如何从开始和结束时间字段中找到最长持续时间?的主要内容,如果未能解决你的问题,请参考以下文章
如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段
Django Admin显示/隐藏字段如果在下拉菜单中选择了特定值