【问题标题】:ordering using SQL's CASE WHEN/THEN syntax django使用 SQL 的 CASE WHEN/THEN 语法 django 进行排序
【发布时间】:2017-05-04 19:05:24
【问题描述】:

我正在尝试在表格中订购联系人,但我遇到了一些问题,我在这个 SO 问题中找到了一个很好的解决方案,也许这是一个过度杀戮,但我试图通过 @ 做到这一点987654322@ 所以我只是用这个来影响我的休息视图,好的,这是我对这个排序的解决方案:

filter_date = self.request.query_params.get('filter_date', None)

        case_sql = '(case when status="Client" ' \
                   'then 1 when status="Contacted" ' \
                   'then 2 when status="Qualified" ' \
                   'then 3 when status="Virgin" then 4 end)'

        if filter_date is not None:
            queryset = queryset.filter(next_action_date=filter_date).extra(select={'status': case_sql},
                                                                           order_by=['status'])

我这样做是因为我不想更改我的数据库字段,就像我说我只想影响我的休息视图一样,所以问题是,我做这个过滤器是否错误所有这些设置都是错误的默认?

模型字段:

status = models.CharField(max_length=10, choices=LeadContactConstants.STATUSES, default=LeadContactConstants.STATUS_PRISTINE)

以及该字段的选择:

class LeadContactConstants(object):
    STATUS_PRISTINE = "PRISTINE"
    STATUS_CONTACTED = "CONTACTED"
    STATUS_QUALIFIED = "QUALIFIED"
    STATUS_CLIENT = "CLIENT"

    STATUSES = ((STATUS_PRISTINE, "Virgin"),
                (STATUS_CONTACTED, "Contacted"),
                (STATUS_QUALIFIED, "Qualified"),
                (STATUS_CLIENT, "Client"))

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您链接到的那个问题是从 2012 年开始的。从那以后发生了很多变化,例如包含.....CASE/WHEN in django。

    Case() 表达式类似于 if ... elif ... else 语句 Python。提供的 When() 对象中的每个条件都在 顺序,直到评估为真实值。结果表达式 从匹配的When() 对象返回。

    整个想法是您不需要像过去人们有时那样编写复杂的查询。

    标准做法是使用 CASE/WHEN 创建注释,然后按顺序在注释中使用它

    【讨论】:

    • 我明白了,所以创建一个注释将帮助我订购这个,我看到它在 django=1.8 中工作,这是我正在使用的版本
    • 如果我没记错的话,那是引入此功能的版本。
    • 我收到 ValueError 的注释,它说它与我的模型字段冲突,有没有办法克服这个问题
    • 肯定有,但这是一个完全不同的问题。请使用您的模型发布一个新问题,以及您得到的确切错误以及您尝试的 django 查询。
    • 好的,我的新问题是link,带有我的自定义注释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多