Django 查询中的自定义属性

Django 查询中的自定义属性,django,django-models,django-queryset,Django,Django Models,Django Queryset,给出下面的简化示例,如何访问queryset中的自定义“current_status”属性?有可能吗 目前,我想列出所有当前事件并显示当前状态。我可以让属性显示在模板中,但是我不能按它排序queryset。或者,我是否需要创建一个自定义管理器,在“Select”中使用某种嵌套的“if”语句 class Event(models.Model): .... date_registered = models.DateField(null=True, blank=True) d

给出下面的简化示例,如何访问queryset中的自定义“current_status”属性?有可能吗

目前,我想列出所有当前事件并显示当前状态。我可以让属性显示在模板中,但是我不能按它排序queryset。或者,我是否需要创建一个自定义管理器,在“Select”中使用某种嵌套的“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)

您不能在查询中使用自定义属性,因为Django的ORM将尝试将其映射到数据库列,但失败。当然,您可以在经过计算的查询集中使用它,例如,当您对查询结果的对象进行迭代时
您只能筛选以下内容:
Event.objects.filter(date\u drafted\u isnull=False)

不要将状态作为属性计算,而是为其创建一个适当的模型字段,并在保存方法中更新它。然后您可以直接在查询中使用该字段。

感谢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)
            '''})