【问题标题】:Sort by complex condition按复杂条件排序
【发布时间】:2015-05-26 07:20:39
【问题描述】:
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

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

请注意,条件只是一个示例,我想按更复杂的条件进行排序,我只是想知道如何做到这一点。

【问题讨论】:

  • 您可以将结果分成两个列表,然后按字母顺序对它们进行排序。
  • Custom ordering in Django的可能重复
  • Queryset.order_by() 依赖于数据库排序,IOW 它只是添加了一个 SQL order by 子句。因此,您可以尝试设置数据库以获得所需的排序,或者(如果您的典型数据集不是太大)进行纯 python 排序,但这可能效率较低。

标签: python django


【解决方案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”函数来做你想做的事。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多