Метод order_by

Метод order_by применяется к QuerySet и возвращает новый QuerySet, отсортированный по указанным полям. По умолчанию сортировка выполняется по возрастанию (ASC). Для сортировки по убыванию нужно добавить знак минуса перед именем поля. Метод можно вызывать цепочкой с другими методами фильтрации.

Синтаксис

pythonModel.objects.order_by(*fields)

Параметры метода:

Пример . Сортировка по одному полю

Давайте отсортируем статьи по дате создания по возрастанию:

pythonfrom myapp.models import Article

articles = Article.objects.order_by('created_at')
for article in articles:
  print(article.title, article.created_at)

Результат выполнения кода:

python"First article" 2025-01-01 10:00:00
"Second article" 2025-01-02 12:00:00
"Third article" 2025-01-03 15:00:00

Пример . Сортировка по убыванию

Теперь отсортируем статьи по дате создания по убыванию:

pythonfrom myapp.models import Article

articles = Article.objects.order_by('-created_at')
for article in articles:
  print(article.title, article.created_at)

Результат выполнения кода:

python"Third article" 2025-01-03 15:00:00
"Second article" 2025-01-02 12:00:00
"First article" 2025-01-01 10:00:00

Сортировка по нескольким полям

Отсортируем статьи сначала по статусу публикации, а затем по дате создания:

pythonfrom myapp.models import Article

articles = Article.objects.order_by('status', '-created_at')
for article in articles:
  print(article.title, article.status, article.created_at)

Результат выполнения кода:

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

Сортировка с фильтрацией

Давайте отфильтруем опубликованные статьи и отсортируем их по названию:

pythonfrom myapp.models import Article

articles = Article.objects.filter(status='published').order_by('title')
for article in articles:
  print(article.title)

Результат выполнения кода:

python"Article about Django"
"Article about Python"
"Article about SQL"

Сортировка по полям связанной модели

Отсортируем статьи по названию категории через связь:

pythonfrom 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"Python article" Backend
"Java article" Backend
"CSS article" Frontend
"HTML article" Frontend

Сортировка с использованием значений

Получим отсортированный список словарей с данными статей:

pythonfrom myapp.models import Article

res = Article.objects.order_by('-views').values('title', 'views')
for item in res:
  print(item)

Результат выполнения кода:

python{"title": "Popular article", "views": 1000}
{"title": "Medium article", "views": 500}
{"title": "New article", "views": 100}

Смотрите также

  • метод filter,
    который фильтрует записи в QuerySet
  • метод exclude,
    который исключает записи из QuerySet
  • метод values,
    который возвращает QuerySet словарей
  • атрибут ordering в Meta классе модели,
    который задает сортировку по умолчанию