获取查询集的当前 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 排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中包含条件 order_by?

Django数据查询中对字段进行排序

查询集 QuerySet

Django数据查询中对字段进行排序

Flask 学习-97.Flask-SQLAlchemy 排序 order_by()

Django告诉双重排序中具有特定属性的最后一项(order_by)