2015-07-20 103 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子句。我還沒有測試過。