2013-01-11 73 views
0

數我有一個簡單的模型,跟蹤請假請求:減去models.DateField獲得天

class LeaveRequest(models.Model): 
    employee = models.ForeignKey(UserProfile) 
    supervisor = models.ForeignKey(UserProfile, related_name='+', blank=False, null=False) 
    submit_date = models.DateField(("Date"), default=datetime.date.today) 
    leave_type = models.CharField(max_length=64, choices=TYPE_CHOICES) 
    start_date = models.DateField(("Date")) 
    return_date = models.DateField(("Date")) 
    total_days = models.IntegerField() 
    notes = models.TextField(max_length=1000) 

    def __unicode__ (self): 
     return u'%s %s' % (self.employee, self.submit_date) 

     class Admin: 
       pass 

     class Meta: 
       ordering = ['-submit_date'] 

在我需要一個函數來計算所需的天數的視圖。其次,我需要一種方法來只計算工作日,但現在我已經得到了以下內容:

def leave_screen(request, id): 
    records = LeaveRequest.objects.filter(employee=id) 
    total_days = LeaveRequest.return_date - LeaveRequest.start_date 
    tpl = 'vacation/leave_request.html' 
    return render_to_response(tpl, {'records': records }) 

其產生的屬性錯誤

type object 'LeaveRequest' has no attribute 'return_date 

有什麼建議?

+0

你在這個視圖中達到什麼目的?此視圖假設顯示特定的請假記錄或列出特定員工的所有請假 – Rohan

回答

0

的ID,而是作爲財產。

class LeaveRequest(models.Model): 
    (other fields) 

    @property 
    def total_days(self): 
     oneday = datetime.timedelta(days=1) 
     dt = self.start_date 
     total_days = 0 
     while(dt <= self.return_date): 
      if not dt.isoweekday() in (6, 7): 
       total_days += 1 
      dt += oneday 
     return totaldays 

# view function 
def leave_screen(request, id): 
    # get leave request by id 
    leavereq = LeaveRequest.objects.get(id=id) 
    return render_to_response("vacation/leave_request.html", {"leavereq": leavereq}) 

# template code 
... 
<body> 
    {{ leavereq.total_days }} 
</body> 
+0

我在這裏得到無效的語法錯誤「total_days(self)」。我認爲這是我需要的方法,我只需要獲得正確的語法。 – kjarsenal

+0

@kjarsenal對不起,修正 – XORcist

+0

不應該是,如果不是dt.isoweekday()在(6,7) – Rohan

1

在total_days中,您調用的是模型,而不是該模型的實例 - records - 您創建的。

如果你想查看剛纔單離場記錄,您將需要通過我不會「TOTAL_DAYS」作爲LeaveRequest類中的字段的LeaveRequest

def leave_screen(request, id): 
    records = LeaveRequest.objects.get(id=id) 
    total_days = records.return_date - records.start_date 
    tpl = 'vacation/leave_request.html' 
    return render_to_response(tpl, {'records': records }) 
+0

我試過'records.return_date',並且我得到另一個屬性錯誤,''QuerySet'對象沒有屬性'return_date'' – kjarsenal

+0

我編輯了我的帖子。在'records'從'.filter'改變爲'.get'。這將返回一個單一的對象。 –

+1

如果此視圖假設列出員工的所有離職,您的答案可能仍然不起作用,因爲您將爲獲取調用獲取多條記錄,從而引發另一個異常。 – Rohan

1

這表明,使用它作爲一個屬性將工作,但我想我會更喜歡保持它作爲一個字段,只計算其在插入時的答案。

class LeaveRequest(models.Model): 
    employee = models.ForeignKey(UserProfile) 
    supervisor = models.ForeignKey(UserProfile, related_name='+', blank=False, null=False) 
    submit_date = models.DateField(("Date"), default=datetime.date.today) 
    leave_type = models.CharField(max_length=64, choices=TYPE_CHOICES) 
    start_date = models.DateField(("Date")) 
    return_date = models.DateField(("Date")) 
    total_days = models.IntegerField() 
    notes = models.TextField(max_length=1000) 

    def __unicode__ (self): 
     return u'%s %s' % (self.employee, self.submit_date) 

    def save(self, *args, **kwargs): 
     self.total_days = (self.return_date - self.start_date).days 
     super(LeaveRequest, self).save(*args, **kwargs) 

     class Admin: 
       pass 

     class Meta: 
       ordering = ['-submit_date'] 

通過這種方式,當您將邏輯排除週末時,您將節省計算時間,以便在列出所有請假時每次計算天數。

+0

這很好。我完全忽略了'total_days'被保存到模型的事實 - 所以您需要重寫Save方法並在那裏計算它。然後你可以用一行'records = LeaveRequest.objects.filter(employee = id)'來使用'leave_screen'函數,並在迭代時調用'records.total_days'。 –