Python django-queryset 对象上的排序函数

Python sorted function on django-queryset objects

我首先尝试按 created_on 降序排序,然后使用相同的 product_users 查询集并在字段为名称的 foreign_key 用户对象上应用排序函数。

product_users = ProductUser.objects.filter(entity=entity).order_by('-created_on')
product_users = sorted(product_users, key=lambda pu(pu.user.name.lower(), pu.status))

我想按第二列降序排列pu.status

为了按多个属性排序,您应该将 lambda 函数设为 return 一个属性元组而不是一个。所以你可以试试:

sorted(product_users, key=lambda pu: (pu.user.name.lower(), pu.status)

但是如果你想按前一个属性升序排序并按后一个属性降序排序,你可以使用一个函数,如中所述

Python Sort Function Documentation:


def multisort(xs, specs):
    for key, reverse in reversed(specs):
        xs.sort(key=attrgetter(key), reverse=reverse)
    return xs

所以 xs 是我们要排序的列表,而 specs 是一个包含元组的列表,作为属性的每个元组:('attr_name', reverse)

Django 1.8+,可以注解用户名小写到queryset,然后用order_by排序

from django.db.models.functions import Lower
       
product_users  = product_users.annotate(name_lower=Lower('user__name'))
product_users  = product_users.order_by('name_lower', '-status')

编辑: 如果您出于某种原因确实需要使用 sorted 函数,请尝试此 link

中的答案

通过在同一个 go 上使用两个排序函数解决了这个问题,首先按状态降序排序,然后按用户名升序排序。

product_users = sorted(product_users, key=lambda pu: (sorted(pu.status, reverse=True), pu.user.name.lower()))