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
首先是名字中带有下划线的那些,然后 - 没有它。
请注意,条件只是一个例子,我希望通过复杂的排序,我只是想知道如何做到这一点。
如何更改常规排序算法的比较功能呢?
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”功能即可完成您想要的操作。
您可以使用extra
的queryset
方法来应用数据库排序
Model1.objects.extra(
select={'has_underscore': "position('_' in name) > 0"},
order_by=['-has_underscore'])
请注意,您将绑定到特定数据库。我的例子是在postgresql上工作。