2010-06-20 75 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) 
      '''})