2015-07-20 5 views
1

У меня есть модель,сортировать QuerySet 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 нужно сортировать на основе значения статуса в соответствии с порядком «да», «нет», «не_суре».

Обращаем ваше внимание, что QS зависит от значения атрибута объекта (то есть значения статуса). В объектах порядка статус = «да» первый следуют «нет» и «not_sure»

+0

сделать заказ поле выбора, а затем отсортировать в соответствии с выбором, где первое значение будет 1,2,3 и так далее, как Order_choice = ((1, да), (2, нет), (3, not_sure)) –

+0

Thanx, Но здесь мне нужно значение db для тех же «да», «нет» и «не_суре». Это сохранит числа в db. :( –

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

Однако, я скорее всего, вместо этого БД. Посмотрите this QA для хорошего трюка:

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

Добавить фрагмент SQL выше запроса, генерируемого ОРМ Джанго (или создать один EX-NOVO) и выполнить 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) 

Он должен работать, при условии, что нет order by предложение уже в sql. Я еще не тестировал его.

Смежные вопросы