Django 按条件过滤
Django filter by condition
我有一个查询集,我想按字母顺序对其进行分页。
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"""
我想我可以遍历每个员工对象并为他们的第一个字母附加一个值...但必须有更好的方法。
嗯,这是 Python,在 Python 中,参数名称是 标识符 。您不能将某种表达式放入其中。
不过,Django 有一些方法可以进行高级过滤。在您的情况下,您想使用 __istartswith
过滤器:
employees_by_letter = [
employees.filter(name<b>__istartswith</b>=letter)
for letter in alphabet
]
这是一个列表理解,将生成这样的列表,即对于每个 letter in alphabet
,对应的查询集都在列表中。
但是请注意,由于您最终会获取每个元素,因此我实际上建议迭代(或执行 groupby
例如)。
喜欢:
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]
)
}
这将构建一个以小写字母(或空字符串,如果有空名称的字符串)为键的字典,并且这些都映射到 Employee
个实例的列表: Employee
s 的名称以该字母开头。所以这意味着我们只对数据库执行一次查询。然而,Django 查询集是惰性的,所以如果您打算只真正获取一些查询集,那么前者会更有效。
我有一个查询集,我想按字母顺序对其进行分页。
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"""
我想我可以遍历每个员工对象并为他们的第一个字母附加一个值...但必须有更好的方法。
嗯,这是 Python,在 Python 中,参数名称是 标识符 。您不能将某种表达式放入其中。
不过,Django 有一些方法可以进行高级过滤。在您的情况下,您想使用 __istartswith
过滤器:
employees_by_letter = [
employees.filter(name<b>__istartswith</b>=letter)
for letter in alphabet
]
这是一个列表理解,将生成这样的列表,即对于每个 letter in alphabet
,对应的查询集都在列表中。
但是请注意,由于您最终会获取每个元素,因此我实际上建议迭代(或执行 groupby
例如)。
喜欢:
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]
)
}
这将构建一个以小写字母(或空字符串,如果有空名称的字符串)为键的字典,并且这些都映射到 Employee
个实例的列表: Employee
s 的名称以该字母开头。所以这意味着我们只对数据库执行一次查询。然而,Django 查询集是惰性的,所以如果您打算只真正获取一些查询集,那么前者会更有效。