我正在使用一个跟踪员工工作时间的系统,并需要计算这些员工的年终信息。在我们的应用程序的一个单独部分中,前一个开发人员遍历了有数小时的员工/员工任务,并创建了字典以传递给视图进行显示。我发现通过对员工应用“临时属性”,我可以大大减少执行此操作所需的代码量,因为我遍历它们然后只是将员工查询集传递到视图中,但这是一种不好的做法,并且有一个更好的方法来解决这个问题?下面是一个例子:
models.py
class Employee(models.Model):
user = models.ForeignKey(User)
class EmployeeTask(models.Model):
emp = models.ForeignKey(Employee)
hours = models.FloatField()
views.py
def employee_report(request):
employees = Employees.objects.all()
tasks = EmployeeTask.objects.all()
for employee in employees:
emp_tasks = [task for task in tasks
if task.employee == employee]
employee.total_hours = 0
for emp_task in emp_tasks:
employee.total_hours += emp_task.hours
context = {
'employees': employees
}
return render(request, 'app/employees.html', context)
我尝试通过创建一个检索员工任务并进行计算但导致大量SQL查询的方法将逻辑放在模型中。获取和匹配员工与视图中的任务是我能找到避免这种情况的唯一方法。这个方法有效,但是我担心它不一定是'pythonic'(或者'djangonic'因为现在感觉像是一件事)的方式。
注意:我在实际视图中做的远不止这些,比如根据类型(付费休假等)过滤任务,并从公司总工时计算员工的使用百分比,所有这些都作为临时属性添加对于观点而言,为了简洁起见,我并未将其全部纳入此处。
答案 0 :(得分:0)
这不是一种糟糕的做法,你可以把它放在你的模型中,就像这样(未经测试,但应该给你一个想法):
class Employee(models.Model):
user = models.ForeignKey(User)
@property
def total_hours(self):
return self.task_set.all().aggregate(models.Sum('hours'))
class EmployeeTask(models.Model):
emp = models.ForeignKey(Employee)
hours = models.FloatField()