以下代码用于确定将对象转储到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
按字母顺序排序,liquourID
是myTableView.datasource = self
myTableView.delegate = self <- this was missing
引用的表中的字段?
答案 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)