Python 根据选择字段中的值对Django查询集进行排序

Python 根据选择字段中的值对Django查询集进行排序,python,django,python-2.7,django-admin,Python,Django,Python 2.7,Django Admin,我有一个模型 class Example(models.Model): MY_CHOICES = ( ("yes", _("Yes")), ("no", _("NO")), ("not_sure", _("Not sure")), ) name = models.CharField(max_length=200, verbose_name=_('Name')) status = models.CharField(max_length=100,choices=MY_CHOI

我有一个模型

class Example(models.Model):
MY_CHOICES = (
    ("yes", _("Yes")),
    ("no", _("NO")),
    ("not_sure", _("Not sure")),
)
name = models.CharField(max_length=200, verbose_name=_('Name'))
status = models.CharField(max_length=100,choices=MY_CHOICES,default='yes')
我需要在get_queryset方法中对查询集进行排序,即

def get_queryset(self, request):
    qs = self.model._default_manager.get_queryset()
    order = ['yes', 'no', 'not_sure']
    qs = #CODE TO ORDER THE S HERE BASED ON order.
    return qs
*我需要的返回值是查询集,而不是排序列表。 *qs需要根据状态值按照“是”、“否”、“不确定”的顺序进行排序

请注意:我需要基于对象属性值(即状态值)的thr QS。按照状态对象的顺序,首先是“是”,然后是“否”和“不确定”

我要说的是,保留你的密码

def get_queryset(self, request):
    qs = self.model._default_manager.get_queryset()
    order = ['yes', 'no', 'not_sure']
    return sorted(qs, key=lambda x: order.index(x.status))
然而,我宁愿让DB来做。 看一看下面的技巧:

ORDER BY idx(array['yes', 'no', 'not_sure'], status)
将上面的SQL片段添加到django的ORM生成的查询中(或从头创建一个),并对其执行以下操作:


如果sql中没有order by子句,它应该可以工作。我还没有测试过它。

更新较新的Django版本(在v3.0.10中测试),不使用自定义SQL语法,使用:


对一个选项字段进行排序,然后根据第一个值为1,2,3的选项进行排序,依此类推,如顺序_choice=((1,yes),(2,no),(3,not_sure))Thanx,但这里我需要相同的db值“yes”,“no”和“not_sure”。这将把数字存储在数据库中:(元排序不够吗?
classmeta:ordering=['status']
。在
get\u queryset
中执行此操作有具体原因吗?如果
排序不起作用,您可以始终有3个单独的查询-一个用于
,一个用于
,另一个用于
不确定
,并在
get\u queryset
中返回链接响应(净效果是一样的,因为查询是惰性地进行计算的)@karthikr很难说出你的意思,但我认为这不会起作用,发布一些代码值得注意的是,这个解决方案使用了PostgreSQL特定的语法。对于其他DBMS,如MySQL或SQLite,你需要不同的语法(例如,
按字段排序)(MySQL的状态为“是”、“否”、“不确定”)
def get_queryset(self, request):
    qs = self.model._default_manager.get_queryset()
    newquery = qs.query+' ORDER BY idx(array'+order.__str__()+', status)'
    return self.model._default_manager.raw(newquery)
from django.contrib import admin
from django.db.models import Case, When, Value

class ExampleAdmin(admin.ModelAdmin):    
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.order_by( Case( 
                       When ( status="yes", then=Value(0) ),
                       When ( status="no", then=Value(1)  ),
                       default = Value(2)
                          )
                    )