【问题标题】:Django: Order_by multiple fieldsDjango:Order_by 多个字段
【发布时间】:2016-08-02 13:25:47
【问题描述】:

我以列表的形式获取 order_by 字段。 我想用 django orm 按多个字段排序。 列表如下:

orderbyList = ['check-in','check-out','location']

我写的查询是这样的:

modelclassinstance.objects.all().order_by(*orderbyList)

我在列表中所期望的一切都是动态的。我没有预先定义的数据集。有人能告诉我如何用这个写一个 django ORM 吗?

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    试试这样的

    modelclassinstance.objects.order_by('check-in', 'check-out', 'location')
    

    你不需要.all()

    您还可以在模型类中定义排序

    类似

    class Meta:
           ordering = ['check-in', 'check-out', 'location']
    

    【讨论】:

    • 谢谢我知道了..我是从其他链接获得的。 modelclassinstance.objects.order_by(*orderbyList)
    【解决方案2】:

    在查询参数中传递订单列表

    例如:yourdomain/?order=location&order=check-out

    default_order = ['check-in']  #default order
    order = request.GET.getlist('order', default_order)
    modelclassinstance.objects.all().order_by(*orderbyList)
    
    

    【讨论】:

      【解决方案3】:

      您应该将数据库表列的字符串化参数列表(由您的 ORM 在相应的 models.py 文件中指定)传递给返回查询集上的 .order_by() 方法,如下所示。 shifts = Shift.objects.order_by('start_time', 'employee_first_name')。通过符号,.order_by(**args),将帮助您记住它接受任意数量的参数。

      【讨论】:

        【解决方案4】:

        modelclassinstance.objects.filter(anyfield='value').order_by('check-in', 'check-out', 'location')

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案5】:

        试试这个:

        listOfInstance = modelclassinstance.objects.all()
        
        for askedOrder in orderbyList:
            listOfInstance = listOfInstance.order_by(askedOrder)
        

        【讨论】:

        • modelclassinstance.objects.order_by(*orderbyList) 是 order_by 的更好方法
        • 根据 Django 文档 (docs.djangoproject.com/en/2.0/ref/models/querysets/#order-by),这种方式无法达到预期的效果——“每个 order_by() 调用都会清除之前的任何排序。”
        • 这最终没用,因为实例列表永远不会保存
        【解决方案6】:

        你要做的就是链接查询集,换句话说:

        classExample.objects.all().order_by(field1).order_by(field2)...
        

        【讨论】:

        • 不要那样做。每个order_by() 调用都会清除之前的任何订单。例如,此查询将按field2 而非field1 排序!!!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2016-03-31
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        相关资源
        最近更新 更多