按复杂条件排序

问题描述 投票:0回答:2
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

首先是名字中带有下划线的那些,然后 - 没有它。

请注意,条件只是一个例子,我希望通过复杂的排序,我只是想知道如何做到这一点。

python django
2个回答
0
投票

如何更改常规排序算法的比较功能呢?

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”功能即可完成您想要的操作。


0
投票

您可以使用extraqueryset方法来应用数据库排序

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

请注意,您将绑定到特定数据库。我的例子是在postgresql上工作。

© www.soinside.com 2019 - 2024. All rights reserved.