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()))
我首先尝试按 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()))