2015-05-26 4 views
0
Model1(models.Model): 
    name = models.CharField(max_length=30) 


Model2(models.Model): 
    model1 = models.ManyToManyField(FontClass) 

res = Model1.objects.all().filter(....).order_by('model1__name....???') 

Как можно сортировать результат по более сложному состоянию? model1__name имеет символ подчеркивания на своем имени? Например, Model1.objects.all().filter(....) возвращает следующие имена:Сортировка по сложному состоянию

aaa_bbb 
aaaccc 
aaa_ttt 
aaa_ddd 
ggggg 
yyy_cccc 
zzz_kkk 
dddd 

После сортировки должно быть:

aaa_bbb 
zzz_kkk 
aaa_ddd 
aaa_ttt 
yyy_cccc 

aaaccc 
ggggg 
dddd 

Первых тем, с подчеркиванием в их именах, а затем - без него.

Обратите внимание, что условие является всего лишь примером того, что я хочу сортировать даже сложные, я просто хочу получить, как это сделать.

+0

Вы можете разбить результаты на два списка, а затем отсортировать их по алфавиту. – rnevius

+0

Возможный дубликат [Пользовательский заказ в Django] (http://stackoverflow.com/questions/883575/custom-ordering-in-django) – Wtower

+0

'Queryset.order_by()' зависит от заказа базы данных, IOW он просто добавляет SQL 'order by'. Таким образом, вы можете либо попытаться настроить свою базу данных, чтобы получить желаемый порядок, либо (если ваш типичный набор данных не слишком велик) идут на чистую сортировку python, но это может быть менее эффективным. –

ответ

-1

Как просто изменить функцию сравнения обычного алгоритма сортировки?

def comp(a, b): 
    if a>b: 
     return True 

def mergeSort(alist): 
    if len(alist)>1: 
     mid = len(alist)//2 
     lefthalf = alist[:mid] 
     righthalf = alist[mid:] 

     mergeSort(lefthalf) 
     mergeSort(righthalf) 

     i=0 
     j=0 
     k=0 
     while i<len(lefthalf) and j<len(righthalf): 
      if comp(righthalf[j], lefthalf[i]): 
       alist[k]=lefthalf[i] 
       i=i+1 
      else: 
       alist[k]=righthalf[j] 
       j=j+1 
      k=k+1 

     while i<len(lefthalf): 
      alist[k]=lefthalf[i] 
      i=i+1 
      k=k+1 

     while j<len(righthalf): 
      alist[k]=righthalf[j] 
      j=j+1 
      k=k+1 

my_list = [10,4,2,5,1] 
mergeSort(my_list) 
print my_list 

Просто измените функцию «comp», чтобы сделать то, что вы хотите.

1

Вы можете использовать extra метод queryset применять базу данных сортировки

Model1.objects.extra(
    select={'has_underscore': "position('_' in name) > 0"}, 
    order_by=['-has_underscore']) 

Обратите внимание, что вы будете привязаны к конкретной базе данных. Мой пример работает над postgresql.

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