![](/img/trans.png)
[英]Django: how to order a queryset by a related object if it exists and by a field if it doesn't?
[英]Django how to order an object based on a related field
以下代码用于确定对象转储到JSON时的顺序。 它还允许datatables 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
引用?
您可以使用与filter
相同的语法样式来查询各种关系。
例如
objects = objects.order_by('tablename__BrandName')
其中tablename
是外键字段的名称。
从Django文档中 :
要按不同模型中的字段排序,请使用与跨模型关系查询时相同的语法。 也就是说,字段名称,后跟双下划线(__),后跟新模型中的字段名称,依此类推。
根据OP的评论进行编辑:
根据您想同时对Datatables 和 BrandName
的选定列进行排序的响应,我认为您想将这两个参数都作为参数传递给order_by
(它需要多个参数来对SQL中的连续列进行排序):
objects = objects.order_by(ordering, 'tablename__BrandName')
或反转参数,具体取决于您要优先使用的列。
因此,我能够自己弄清楚该怎么做。 我不确定它是否是最好的解决方案,但是实现if and 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.