2017-08-14 56 views
0

我有2个字段,总年度叶和年采取的叶子, 使用.aggregate(Sum())我已经计算了一个雇员的年度总采伐量。蟒蛇 - 用.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> 

+1

在您的问题中包含完整的追溯 –

+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) 

希望它能帮助。

+0

嗨@熊布朗,它的工作原理!非常感谢你的帮助!不知道为什么有人会投票回答你的回答 –

+0

很高兴帮助你)这样的人民)) –

0

聚合总和返回一个键值对,所以你必须从字典中获取值。

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将无需循环工作