2015-07-20 68 views
1

我有一个模型值的Django的查询集,排序基于选择现场

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 

*我需要的返回值是一个QuerySet而不是一个排序列表。 * qs需要根据状态值按照“yes”,“no”,“not_sure”顺序进行排序。

请注意:我需要基于对象属性值(即状态值)的thr QS。在状态的命令对象=“是”第一其次是“没有”和“not_sure”

+0

使命令选择字段,然后按照第一个值将1,2,3等依次选择排序,如Order_choice =((1,是),(2,no),(3,not_sure)) –

+0

Thanx,但在这里我需要的分贝值相同的'是','不'和'not_sure'。这会将数字存储在数据库中。 :( –

+1

元的排序是不是足够了?class Meta:ordering = ['status']'。'get_queryset'有特定的原因吗? – Pynchia

回答

2

鉴于this previous SO Q/A

,并保持你的代码,我会说

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代替它。 看一看this QA一个不错的伎俩:

ORDER BY idx(array['yes', 'no', 'not_sure'], status) 

加入SQL片段以上通过Django的ORM生成的查询(或创建一个前诺),并用它进行raw query

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) 

它应该工作,只要在sql中没有order by子句。我还没有测试过。