2017-08-14 54 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將無需循環工作