使用SQL的CASE WHEN / THEN语法django进行排序

时间:2017-05-04 10:55:18

标签: python django django-rest-framework

我试图在桌面上订购联系人,而我遇到了一些问题,我在这个SO问题中找到了一个很好的解决方案,也许这对此来说是过度杀戮,但是我试图在restapi上执行此操作,所以我只会影响我的休息视图,好吧这是我的解决方案:

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"))

1 个答案:

答案 0 :(得分:2)

你所关联的问题是从2012年开始。自那时以来发生了很多变化,例如包含..... CASE/WHEN in django

  

Case()表达式与if中的if ... elif ... else语句类似   蟒蛇。计算所提供的When()对象中的每个条件   命令,直到一个人评估一个真实的价值。结果表达式   从匹配的When()对象返回。

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

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