gpt4 book ai didi

python - 如何计算 Django 的总工作时间?

转载 作者:行者123 更新时间:2023-12-03 23:02:33 27 4
gpt4 key购买 nike

我创建了以下模型:

class Timesheet(models.Model):
date = models.DateField(auto_now=False, auto_now_add=False, verbose_name="Data")
entry = models.TimeField(auto_now=False, auto_now_add=False, verbose_name="Hora Entrada")
lunch = models.TimeField(auto_now=False, auto_now_add=False, null=True, blank=True, verbose_name="Início do Almoço")
lunch_end = models.TimeField(auto_now=False, auto_now_add=False, null=True, blank=True, verbose_name="Fim do Almoço")
out = models.TimeField(auto_now=False, auto_now_add=False, verbose_name="Hora de Saída")
然后将其返回到一个表中,该表有一个名为“总工时”的额外字段,我需要在其中计算总工时。每个条目指的是同一天。
我有以下观点:
def timesheet(request):
c = Timesheet.objects.all()
context = {'c': c}
return render(request, "tracker/timesheet.html", context)
我需要做的计算是: (out - entry) - (lunch_end - lunch) .
我怎样才能做到这一点?

最佳答案

您可以 .annotate(…) [Django-doc]每个Timesheet对象:

from django.db.models import DurationField, ExpressionWrapper, F, IntegerField

Timesheet.objects.annotate(
total_time=ExpressionWrapper(
ExpressionWrapper(F('out') - F('entry'), output_field=IntegerField()) -
ExpressionWrapper(F('lunch_end') - F('lunch'), output_field=IntegerField()),
output_field=DurationField()
)
)
这里各 Timesheet从此查询集产生的对象将有一个额外的属性 .total_time这将包含该人工作的持续时间(因此减去午休时间)。
或者您可以用 .aggregate(…) [Django-doc] 总结所有记录:
from django.db.models import DurationField, ExpressionWrapper, F, IntegerField

Timesheet.objects.aggregate(
total_time=Sum(
ExpressionWrapper(F('out') - F('entry'), output_field=IntegerField()) -
ExpressionWrapper(F('lunch_end') - F('lunch'), output_field=IntegerField()),
output_field=DurationField()
)
)['total_time']
如果 lunchlunch_end可以 None/ NULL ,您可以使用 Coalesce [Django-doc] :
from django.db.models import DurationField, ExpressionWrapper, F, IntegerField, Value
from django.db.models.functions import Coalesce

Timesheet.objects.aggregate(
total_time=Sum(
ExpressionWrapper(F('out') - F('entry'), output_field=IntegerField()) -
Coalesce(ExpressionWrapper(F('lunch_end') - F('lunch'), output_field=IntegerField()), Value(0)),
output_field=DurationField()
)
)['total_time']
如果您因此有 .annotate(…) d 所有 Timesheet记录,并将这些作为 c 传递, 您可以使用:
{% for ci in c %}
{{ ci.data }}: {{ ci.entry }} - {{ ci.out }}; {{ ci.total_time }}
{% endfor %}

关于python - 如何计算 Django 的总工作时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64707273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com