Python Django条件滤波器

Python Django条件滤波器,python,django,django-queryset,django-orm,django-filter,Python,Django,Django Queryset,Django Orm,Django Filter,我有一个查询集,我想按字母顺序分页 employees = Employee.nodes.order_by('name') 我想将员工姓名的第一个字母name[0]与我正在迭代的字母进行比较。-但我不知道如何根据应用于属性的条件进行过滤 employees_by_letter = [] for letter in alphabet: employees_by_this_letter = employees.filter(name[0].lower()=letter)

我有一个查询集,我想按字母顺序分页

employees = Employee.nodes.order_by('name')
我想将员工姓名的第一个字母
name[0]
与我正在迭代的字母进行比较。-但我不知道如何根据应用于属性的条件进行过滤

employees_by_letter = []      

for letter in alphabet: 
    employees_by_this_letter = employees.filter(name[0].lower()=letter)
    employees_by_letter.append(employees_by_this_letter)

  """error -- SyntaxError: keyword can't be an expression"""

我想我可以遍历每个employee对象,并为它们的第一个字母添加一个值。。。但是必须有更好的方法。

这是Python,Python中的参数名是标识符。你不能在其中加入某种表达

然而,Django有一些方法来进行高级过滤。在您的情况下,您希望使用过滤器:


这将构造一个以小写字母(或空字符串,如果有空名称的字符串)为键的字典,所有这些都映射到
Employee
实例列表:名称以该字母开头的
Employee
s。这意味着我们只对数据库执行一个查询。然而,Django查询集是懒惰的,因此如果您计划只获取少数查询集,那么前者可以更有效。

这就是Python,Python中的参数名是标识符。你不能在其中加入某种表达

然而,Django有一些方法来进行高级过滤。在您的情况下,您希望使用过滤器:

这将构造一个以小写字母(或空字符串,如果有空名称的字符串)为键的字典,所有这些都映射到
Employee
实例列表:名称以该字母开头的
Employee
s。这意味着我们只对数据库执行一个查询。然而,Django QuerySet是懒惰的,所以如果您计划只获取几个QuerySet,那么前者会更有效

employees_by_letter = [
    employees.filter(name__istartswith=letter)
    for letter in alphabet
]
from django.db.models.functions import Lower
fromiteratools import groupby

employees_by_letter = {
    k: list(v)
    for k, v in groupby(
        Employee.annotate(lowname=Lower('name')).nodes.order_by('lowname'),
        lambda x: x.lowname[:1]
    )
}