Django фильтр по условию - PullRequest
0 голосов
/ 03 июня 2018

У меня есть набор запросов, который я хочу разбить на страницы по алфавиту.

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"""

Полагаю, я мог бы пройтись по каждому объекту сотрудника и добавить значение для его первой буквы ... но должен быть лучший способ.

1 Ответ

0 голосов
/ 03 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...