获取查询集的当前 order_by 排序
Posted
技术标签:
【中文标题】获取查询集的当前 order_by 排序【英文标题】:Get a queryset's current order_by ordering 【发布时间】:2015-11-15 09:37:34 【问题描述】:我想在给定主键的查询集中查找相邻项,正如here 所询问的那样。但是我希望这适用于任何给定的查询集,我还没有为自己设置排序。如何找到 __gt
和 __lt
过滤的查询集的当前顺序?
例如:
queryset = MyModel.objects.all().order_by('some_field')
next_obj = get_next(queryset, after_pk, 10)
...
def get_next(queryset, pk, n):
#ordering is unknown here
obj = queryset.get(pk=pk)
field = queryset.get_order_by_field_name() #???
return queryset.filter(**field+'__gt': getattr(obj, field))[:n]
模型可以定义一个默认的ordering,我可以检查查询集是否为ordered,但我认为在这种情况下两者都没有帮助。
【问题讨论】:
【参考方案1】:您可以通过访问queryset.query.order_by
属性从 order_by 子句中检索列列表。
来自 django 文档:
查询属性是一个不透明的对象。它代表查询构造的内部结构,不是公共 API 的一部分。但是,按照此处所述,腌制和取消腌制属性的内容是安全的(并且完全支持)。
【讨论】:
order_by
似乎是一个数组,虽然 afaik 随后的 .order_by()
调用会覆盖以前的调用,所以我想我想要的值总是 queryset.query.order_by[-1]
?
为什么不query.order_by[0]
?如果你只用一列调用.order_by()
,显然,这些值是相等的,但如果你按多个列排序,那么第一列是最重要的(我认为)。
为清楚起见,queryset.query.order_by 返回 .order_by(...) 给出的排序。但是,它不会告诉您有关模型 Meta 中定义的排序的任何信息。因此,如果 queryset.query.order_by 结果是 [],您的模型仍将根据模型的元定义进行排序。以上是关于获取查询集的当前 order_by 排序的主要内容,如果未能解决你的问题,请参考以下文章