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]
)
}