获取查询集的当前order_by排序。

12

我想找到一个查询集中给定主键的相邻项,就像这里所问的那样。但是我希望这适用于任何给定的查询集,即我没有自己设置排序方式。如何找到用于__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]

该模型可以定义一个默认的排序方案,并且我可以检查查询集是否已排序,但我认为这两种方法在此情况下都不太有用。

1个回答

19

通过访问queryset.query.order_by属性,您可以从order_by子句中检索列的列表。

来自Django文档:

查询属性是一个不透明的对象。它表示查询构造的内部部分,不是公共API的一部分。但是,根据此处描述,pickle和unpickle属性内容是安全的(且完全支持的)。


order_by 似乎是一个数组,尽管据我所知,后续的 .order_by() 调用会覆盖之前的调用,所以我猜想我想要的值总是 queryset.query.order_by[-1] - jozxyqk
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Akisame
1
为了清晰起见,queryset.query.order_by 返回由 .order_by(...) 给出的排序。然而,它并不会告诉你关于模型 Meta 中定义的排序的任何信息。因此,如果 queryset.query.order_by 结果为空列表,你的模型仍将按照模型的 Meta 定义进行排序。 - Wim Feijen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接