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