Django如何根据相关字段订购对象

时间:2015-04-29 02:04:05

标签: python django

以下代码用于确定将对象转储到JSON时的顺序。它还允许数据表jquery插件设置按顺序建立的列,以及它的升序或降序。这对于对象的默认排序非常有用,但是如果我想根据相关字段对对象进行排序呢?我该怎么办?

objects = StoreLiquor.objects.filter(storeID=store_id)
keys = ['SPI', 'liquorID']

#sorting
order = dict( enumerate(keys) )
dirs = {'asc': '', 'desc': '-'}
ordering = dirs[request.GET['sSortDir_0']] + order[int(request.GET['iSortCol_0'])]
objects = objects.order_by(ordering)

使用此代码,它将根据作为外键的liquourID进行排序。但是,如何才能根据BrandName按字母顺序排序,liquourIDmyTableView.datasource = self myTableView.delegate = self <- this was missing 引用的表中的字段?

2 个答案:

答案 0 :(得分:0)

您可以使用与filter相同的语法样式来查询关系。

e.g。

objects = objects.order_by('tablename__BrandName')

其中tablename外键字段的名称。

来自Django doc

  

要按其他模型中的字段排序,请使用与when相同的语法   你正在查询模型关系。就是这个名字   字段,后跟双下划线(__),后跟名称   新模型中的字段,等等,可以根据需要添加任意数量的模型   加入。

根据OP的评论进行编辑:

根据您希望按数据表 BrandName中的所选列进行排序的回复,我认为您希望将两者都作为参数传递到order_by(由 SQL 中的连续列接受多个参数排序):

objects = objects.order_by(ordering, 'tablename__BrandName')

或者反转参数,具体取决于您希望优先使用的列。

答案 1 :(得分:0)

所以我能够自己解决这个问题,如何做到这一点。我不确定它是否是最好的解决方案,但实现if和then语句确实有效。因为enumerate(keys)keys中的每个键分配一个整数,并且对要排序的按下列的请求也返回一个int,我将其设置为根据它的升序或降序来改变该顺序,以及如果按下第二列。

#sorting
order = dict( enumerate(keys) )
direction = request.GET['sSortDir_0']
column = request.GET['iSortCol_0']
dirs = {'asc': '', 'desc': '-'}
if direction == 'asc' and column == '1':
    ordering = dirs[direction] + order[int(column)]
    objects = objects.order_by('liquorID__BrandName')
elif direction == 'desc' and column == '1':
    ordering = dirs[direction] + order[int(column)]
    objects = objects.order_by('-liquorID__BrandName')
else:
    ordering = dirs[direction] + order[int(column)]
    objects = objects.order_by(ordering)