Метод order_by
Метод order_by применяется к QuerySet и возвращает новый QuerySet,
отсортированный по указанным полям. По умолчанию сортировка
выполняется по возрастанию (ASC). Для сортировки по убыванию
нужно добавить знак минуса перед именем поля. Метод можно
вызывать цепочкой с другими методами фильтрации.
Синтаксис
Model.objects.order_by(*fields)
Параметры метода:
-
fields- имена полей модели, по которым выполняется сортировка. Можно передать одно или несколько полей. Для сортировки по убыванию используется префикс'-'.
Пример . Сортировка по одному полю
Давайте отсортируем статьи по дате создания по возрастанию:
from myapp.models import Article
articles = Article.objects.order_by('created_at')
for article in articles:
print(article.title, article.created_at)
Результат выполнения кода:
"First article" 2025-01-01 10:00:00
"Second article" 2025-01-02 12:00:00
"Third article" 2025-01-03 15:00:00
Пример . Сортировка по убыванию
Теперь отсортируем статьи по дате создания по убыванию:
from myapp.models import Article
articles = Article.objects.order_by('-created_at')
for article in articles:
print(article.title, article.created_at)
Результат выполнения кода:
"Third article" 2025-01-03 15:00:00
"Second article" 2025-01-02 12:00:00
"First article" 2025-01-01 10:00:00
Сортировка по нескольким полям
Отсортируем статьи сначала по статусу публикации, а затем по дате создания:
from myapp.models import Article
articles = Article.objects.order_by('status', '-created_at')
for article in articles:
print(article.title, article.status, article.created_at)
Результат выполнения кода:
"Draft article" draft 2025-01-03 15:00:00
"Second article" published 2025-01-02 12:00:00
"First article" published 2025-01-01 10:00:00
Сортировка с фильтрацией
Давайте отфильтруем опубликованные статьи и отсортируем их по названию:
from myapp.models import Article
articles = Article.objects.filter(status='published').order_by('title')
for article in articles:
print(article.title)
Результат выполнения кода:
"Article about Django"
"Article about Python"
"Article about SQL"
Сортировка по полям связанной модели
Отсортируем статьи по названию категории через связь:
from myapp.models import Article
articles = Article.objects.select_related('category').order_by('category__name')
for article in articles:
print(article.title, article.category.name)
Результат выполнения кода:
"Python article" Backend
"Java article" Backend
"CSS article" Frontend
"HTML article" Frontend
Сортировка с использованием значений
Получим отсортированный список словарей с данными статей:
from myapp.models import Article
res = Article.objects.order_by('-views').values('title', 'views')
for item in res:
print(item)
Результат выполнения кода:
{"title": "Popular article", "views": 1000}
{"title": "Medium article", "views": 500}
{"title": "New article", "views": 100}