python - 使用.aggregate(Sum())结果减去字段值

时间:2017-08-14 07:30:28

标签: python django

我有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>

2 个答案:

答案 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将无需循环