【问题标题】:dJango order by list of conditionsdJango 按条件列表排序
【发布时间】:2016-11-16 16:20:56
【问题描述】:

假设我有一个包含 3 个条件的列表:conditionAconditionBconditionC

我希望能够对我的查询集进行排序,以便匹配 conditionAconditionBconditionC 的项目首先出现,然后是 conditionAconditionB,然后是 conditionAconditionC 等。有办法吗?

【问题讨论】:

    标签: python django python-2.7 django-models django-views


    【解决方案1】:

    order_by() (docs) 将遵守您输入参数的顺序。

    编辑

    这有点时髦,但是这样做应该可以满足您的需求:

    你可以这样排序:

    funky_queryset = MyModel.objects.filter(name="john")
    funky_queryset |= MyModel.objects.filter(other_condition)
    ...
    

    funky_queryset 将按照您向其中添加更多项目的顺序排列。 |= 运算符可让您组合查询集。

    另一个例子:

    假装你有这个要排序的查询集:

    [<James Bond >, <Bart Simpson >, <John Jacob >, <John Stamos >, <Max Payne >]
    

    假设conditionA 是您想要拥有name="john"conditionB 是您想要拥有name="max",条件C 是您想要所有其他人。你可以这样做:

    from django.db.models import Q
    
    sorted_queryset = MyModel.objects.filter(name="john")  # conditionA
    sorted_queryset |= MyModel.object.filter(name="max")  # conditionB
    sorted_queryset |= MyModel.objects.exclude(Q(name="john") | Q(name="max"))  # conditionC 
    

    结果将是[&lt;John Jacob&gt;, &lt;John Stamos&gt;, &lt;Max Payne&gt;, &lt;Bart Simpson&gt;, &lt;James Bond&gt;]

    【讨论】:

    • 谢谢,如果我的情况像name='john'这样可以吗?
    • 您可能需要为此使用过滤器。您可以按名称的字母顺序排序。
    • 我需要它是一个排序的列表,以便带有name=john的对象首先出现,然后剩下的出现:\
    • 谢谢,但我不想过滤它,我想对查询集进行排序。我应该只做一个过滤器然后从所有列表中减去它吗?
    • @FriGate 通过像这样按顺序过滤它们,您正在构建一个按您想要的顺序的查询集。
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2021-09-12
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多