我有2个田地,每年的叶子总数和每年的叶子,
使用.aggregate(Sum())
我计算了员工每年的总休假额。
但现在我想计算用户可用的剩余叶子,即
年度总叶数 - 每年总叶数
但是我遇到了麻烦,因为annual_taken
是一个字符串而不是浮点数
它给了我这个错误:
不支持的操作数类型 - :'float'和'str'
我该如何解决这个问题?非常感谢任何帮助
以下是我的代码: model.py
class LeavesEntitlement(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='+')
type = models.ForeignKey(LeavesType, on_delete=models.CASCADE, related_name='+')
days = models.FloatField(null=True, blank=True)
class Leave(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='+')
type = models.ForeignKey(LeavesType, on_delete=models.CASCADE, related_name='+')
duration = models.FloatField()
View.py
def my_leaves_view(request):
annual = LeavesEntitlement.objects.all().filter(employee=request.user.profile.employee.id, type=1)
annual_taken = Leave.objects.all().filter(employee=request.user.profile.employee.id, type=1).aggregate(Sum('duration'))
for annual_field in annual:
for field in annual_taken:
annual_available = annual_field.days - field
context = {'form': form,
'annual': annual,
'annual_taken': annual_taken,
'annual_available': annual_available
}
return render(request, 'hrm/my_leaves/my_leaves_content.html', context)
HTML
<table id="my_entitlement_table" class="display table table-hover table-responsive" width="100%">
<thead>
<tr>
<th class="small text-muted text-uppercase"><strong>Leave Type</strong></th>
<th class="small text-muted text-uppercase"><strong>Total</strong></th>
<th class="small text-muted text-uppercase"><strong>Taken</strong></th>
<th class="small text-muted text-uppercase"><strong>Available</strong></th>
</tr>
</thead>
<tbody>
{% for annual_field in annual %}
<tr>
<td>{{annual_field.days}}</td>
<td>{{annual_taken.duration__sum}}</td>
<td>{{annual_available}}</td>
</tr>
{% endfor %
</tbody>
答案 0 :(得分:1)
在现场你有一个字典,所以
进行一些重构(如果使用过滤器则不需要所有过滤器,如果定义了员工则更具可读性),您的代码可能会显示:
employee = request.user.profile.employee.id
annual = LeavesEntitlement.objects.filter(employee=employee, type=1)
annual_taken = Leave.objects.filter(employee=employee, type=1).aggregate(Sum('duration'))
for annual_line in annual:
annual_available = annual_line.days - annual_taken.get('duration__sum', 0)
希望它有所帮助。
答案 1 :(得分:0)
聚合和返回一个键值对,因此您必须从dict获取值。
annual_taken = Leave.objects.all()
.filter(employee=request.user.profile.employee.id,
type=1).aggregate(Sum('duration'))
然后
sum_taken = annual_taken.get('duration__sum')
此代码中的循环
for field in annual_taken:
annual_available = annual_field.days - field
错了。你试图迭代一个字典。删除此循环并使用sum_taken
将无需循环