values и values_list и сортировка

Последнее обновление: 26.08.2022

Сортировка

Для сортировки по возрастанию применяется функция order_by. В нее передаются поля, по которым идет сортировка:

from .models import Person

# упорядочиваем по имени по возрастанию
people = Person.objects.order_by("name")
for person in people:
    print(person.name)

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

# упорядочиваем по имени и возрасту
people = Person.objects.order_by("name", "age")

Для сортировки по убыванию перед названием поля указывается знак минус:

# упорядочиваем по имени по убыванию
people = Person.objects.order_by("-name")

values и values_list()

Методы values() и values_list() предназначены для оптимизации: для извлечения поднабора данных без необходимости создания полного объекта модели.

values возвращает объект QuerySet, где каждый объект модели представлен в виде словаря:

from .models import Person 

people = Person.objects.values()
print(people)

# Результат
# <QuerySet [{'id': 1, 'name': 'Bob', 'age': 42}, {'id': 2, 'name': 'Tom', 'age': 38}, {'id': 3, 'name': 'Sam', 'age': 28}, {'id': 4, 'name': 'Alice', 'age': 32}, {'id': 5, 'name': 'Tom', 'age': 22}]>

Также можно передать в метод values названия полей, которые должны быть в словаре (по умолчанию выбираются все поля модели):

people = Person.objects.values("id", "name")
print(people)

# Результат
# <QuerySet [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}, {'id': 3, 'name': 'Sam'}, {'id': 4, 'name': 'Alice'}, {'id': 5, 'name': 'Tom'}]>

В данном случае словарь будет включать только поля id и name.

Метод values_list во многом аналогичен values(): он возвращает объект QuerySet, который состоит из кортежей. Каждый кортеж хранит данные одного объекта модели. Например:

from .models import Person 

people = Person.objects.values_list()
print(people)

# Результат
# <QuerySet [(1, 'Bob', 42), (2, 'Tom', 38), (3, 'Sam', 28), (4, 'Alice', 32), (5, 'Tom', 22)]>

Также можно выбрать отдельные поля, передав их названия в метод:

people = Person.objects.values_list("id", "name")
print(people)

# Результат
# <QuerySet [(1, 'Bob'), (2, 'Tom'), (3, 'Sam'), (4, 'Alice'), (5, 'Tom')]>

Если выбирается только одно поле, то в итоге получится набор кортежей, в каждом из которых будет по одному значению. Но передав параметру flat значение True можно упростить набор, вынеся значения на уровень выше:

people = Person.objects.values_list("name", flat=True)
print(people)

# Результат
# <QuerySet ['Bob', 'Tom', 'Sam', 'Alice', 'Tom']>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850