鉴于下面的简化示例,我如何在查询集中访问我的自定义“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)
答案 0 :(得分:2)
不是将状态计算为属性,而是为其创建适当的模型字段并在save方法中更新它。然后,您可以直接在查询中使用该字段。
答案 1 :(得分:0)
您不能在查询中使用自定义属性,因为Django的ORM会尝试将其映射到数据库列并失败。当然,您可以在评估的查询集中使用它,例如当你迭代查询结果的对象时!
您只能过滤以下内容:Event.objects.filter(date_drafted__isnull=False)
。
http://docs.djangoproject.com/en/dev/ref/models/querysets/#isnull
答案 2 :(得分:0)
感谢丹尼尔。我想我可能会用你的方法。但是,我还设法使用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)
'''})