2010-06-20 113 views
2

鑑於下面的簡化示例,我將如何訪問查詢集中的自定義「current_status」屬性?它甚至有可能嗎?查詢中的自定義屬性

目前,我想列出所有當前事件並顯示當前狀態。我可以將屬性顯示在模板中,但我無法通過它訂購查詢集。或者,我是否需要在「選擇」中創建一個帶有某種嵌套的「if」語句的自定義管理器?

class Event(models.Model): 
    .... 

    date_registered = models.DateField(null=True, blank=True) 
    date_accepted = models.DateField(null=True, blank=True) 
    date_reported = models.DateField(null=True, blank=True) 
    ... 

    def _get_current_status(self): 
     ... 
     if self.date_reported: 
      return "Reported" 
     if self.date_accepted: 
      return "Accepted" 
     if self.date_registered: 
      return "Registered" 
     if self.date_drafted: 
      return "Drafted" 

    current_status = property(_get_current_status) 

回答

2

不是將狀態計算爲屬性,而是爲其創建適當的模型字段並在save方法中更新它。然後,您可以直接在查詢中使用該字段。

0

由於Django的ORM將嘗試將其映射到數據庫列並失敗,因此您無法在查詢中使用自定義屬性。當然,您可以在評估的查詢集中使用它,例如,當你迭代查詢結果的對象時!
您只能篩選諸如:Event.objects.filter(date_drafted__isnull=False)http://docs.djangoproject.com/en/dev/ref/models/querysets/#isnull

0

感謝Daniel。我想我可能會用你的方法。但是,我也設法使用queryset'extra'方法來工作,這對其他人也可能有用,儘管它可能不是數據庫不可知的。

qs = Event.objects.extra(select={'current_status_id': 
      '''(CASE 
      WHEN date_cancelled THEN 0 
      WHEN date_closed THEN 6 
      WHEN date_signed_off THEN 5 
      WHEN date_reported THEN 4 
      WHEN date_accepted THEN 3 
      WHEN date_registered THEN 2 
      WHEN date_drafted THEN 1 
      ELSE 99 
      END) 
      '''})