【问题标题】:Custom properties in a query查询中的自定义属性
【发布时间】:2010-06-20 15:02:33
【问题描述】:

鉴于下面的简化示例,我将如何在查询集中访问我的自定义“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)

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不能在查询中使用自定义属性,因为 Django 的 ORM 会尝试将其映射到数据库列并失败。当然,您可以在 evaluated 查询集中使用它,例如当您迭代查询结果的对象时!
      您只能过滤以下内容:Event.objects.filter(date_drafted__isnull=False)http://docs.djangoproject.com/en/dev/ref/models/querysets/#isnull

      【讨论】:

        【解决方案3】:

        感谢丹尼尔。我想我可能会使用你的方法。但是,我还设法使用 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)
                    '''})
        

        【讨论】:

          猜你喜欢
          • 2011-11-29
          • 1970-01-01
          • 2021-05-22
          • 2019-08-02
          • 1970-01-01
          • 1970-01-01
          • 2020-07-20
          • 2011-09-19
          • 2018-11-15
          相关资源
          最近更新 更多