Ну, это 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
с именем, начинающимся с этой буквы.Это означает, что мы выполняем только один запрос к базе данных.Наборы запросов Django, тем не менее, ленивы, поэтому, если вы планируете действительно выбрать только несколько наборов запросов, тогда первый может быть более эффективным.