在Django模板中:显示计算变量的总和

jaxagkaj  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(118)

现在我想知道是否有一种方法可以在Django-Template中显示变量的总和。我的意思是,如果我有相同类型的变量,是否有一个模板侧函数来添加它们?
我知道,“逻辑”通常应该在模板之外,所以我写了一个函数来执行我想在模板中看到的计算:

def mission_duration(self):
    duration = self.end - self.begin
    return duration.days

然后在模板中使用它,效果很好。
但是,如果我在模板中有几个这样的变量,有没有一种简单的方法来总结它们的值并显示结果?现在,变量通过查询数据库来显示,通过for循环。结果可能会显示在模板中的循环之外...
或者在另一边:我怎么能把这个放在模型/view.py上来解决模板之外的问题呢?任务是在一个oneToMany关系表中到“雇员”...并且通常显示雇员的数据。所以对于模型/视图解决方案,我目前还不知道,如何循环到雇员的所有任务条目以在渲染模板之前建立所需的总和...

  • 编辑04/20/2023:
    在第一个答案的基础上(它对我的应用程序结构做了一些非常好的假设),我改变了几件事,现在有以下代码:
    views.py:
...
context = {
...
'missions':Foreign_Missions.objects.filter(employee_id=request.POST['id']).order_by('-begin'),
'total_duration_days':Foreign_Missions.objects.total_duration_days(employee)
}

return render(request, 'show.html', context)

inmodels.pyin class“Foreign_Missions”:...

objects = Duration_Manager()

...
在managers.py

class Duration_Manager(models.Manager):
    def with_duration_days(self):
        return self.annotate(
            duration_days=  ExpressionWrapper(
                (F('end') - F('begin')), output_field=fields.DurationField()
            )
        )

    def total_duration_days(self, employee):
        return self.with_duration_days().filter(employee=employee).aggregate(
            total_duration=Sum('duration_days')
        )['total_duration']

现在它的作品…仍然要编辑输出格式的持续时间字段在“天只”,但计算工作正确了

wlzqhblo

wlzqhblo1#

我可能会通过为你的模型设置一个自定义管理器来解决这个问题,我对你的模型做了一些假设:

class MissionManager(models.Manager):
    def with_duration_hours(self):
        return self.annotate(
            duration_hours=ExpressionWrapper(
                (F('end') - F('start')).total_seconds() / 3600, output_field=fields.FloatField()
            )
        )

    def total_duration_hours(self, employee):
        return self.filter(employee=employee).with_duration_hours().aggregate(
            total_duration=Sum('duration_hours')
        )['total_duration']

class Mission(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()

    objects = MissionManager()

在您看来,您可以执行以下操作:

def your_view(request, employee_id):
    employee = Employee.objects.get(pk=employee_id)
    context["employee_missions"] = Mission.objects.filter(employee=employee).with_duration_hours()
    context["total_duration_hours"] = Mission.objects.total_duration_hours(employee)

相关问题