Python Django如何根据相关字段对对象进行排序

Python Django如何根据相关字段对对象进行排序,python,django,Python,Django,以下代码用于确定对象转储到JSON时的顺序。它还允许datatables jquery插件设置建立顺序的列,以及其升序或降序。这对于对象的默认排序非常有效,但是如果我想根据相关字段对对象进行排序,该怎么办?我该怎么做 objects = StoreLiquor.objects.filter(storeID=store_id) keys = ['SPI', 'liquorID'] #sorting order = dict( enumerate(keys) ) dirs = {'asc': ''

以下代码用于确定对象转储到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)

有了这段代码,它将根据Liquiourid(外键)进行排序。但是,我怎样才能让它根据表中Liquiourid引用的字段BrandName按字母顺序排序呢?

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

e、 g

其中tablename是外键字段的名称

从:

要按不同模型中的字段排序,请使用与 您正在跨模型关系进行查询。就是这个 字段,后跟一个双下划线,后跟 新模型中的字段,依此类推,以获得所需的任意多个模型 加入

根据OP的评论进行编辑:

根据您希望按Datatables中的选定列和BrandName进行排序的响应,我认为您希望将这两个列都作为参数传递给order_,通过order_按SQL中的连续列对多个参数进行排序:


或者反转参数,这取决于您希望优先的列。

因此,我能够自己解决这个问题,如何做到这一点。我不确定这是否是最好的解决方案,但实现if和then语句确实有效。由于enumeratekeys为键中的每个键分配一个整数,并且请求对按下的列进行排序也会返回一个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)

我已经尝试过了,它不会改变表中排序的任何内容,因为它仍然只查找Ligroid字段并按该字段进行搜索。在更改了order_by之后,生成的查询是什么样子的?调用print on objects.query,您应该可以在运行runserver的终端中看到输出。如果您还将额外的FK添加到过滤器中,然后还调用select_related会怎么样?如果我在排序部分根据您的拥有方式设置订单,那么它将按品牌名称排序。但是,它会破坏代码提供的所有功能,例如允许它反向排序,或允许它按不同对象排序。我以为您想覆盖默认行为?除了已选择的列之外,是否还要按品牌名称进行排序?如果您单击在特定列上的Datatables中进行排序,那么根据定义,这将在单个列上进行排序,无论指定哪个方向。是的,这正是我想要的。但我修改了它,给我的是品牌名,而不是酒代码。但我似乎无法按品牌名称进行分类。
objects = objects.order_by(ordering, 'tablename__BrandName')
#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)