【问题标题】:Get a queryset's current order_by ordering获取查询集的当前 order_by 排序
【发布时间】: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,但我认为在这种情况下两者都没有帮助。

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案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 结果是 [],您的模型仍将根据模型的元定义进行排序。
    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多