Для сортировки по возрастанию применяется функция 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 возвращает объект 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']>