Ответ
В Django ORM для сортировки результатов запроса используется метод order_by() у объекта QuerySet. Этот метод транслируется в SQL-выражение ORDER BY и позволяет упорядочивать данные по одному или нескольким полям.
Основные способы использования order_by():
-
Сортировка по одному полю (по возрастанию): Укажите имя поля в качестве аргумента.
# Сортировка пользователей по имени (от А до Я) users = User.objects.order_by('username') -
Сортировка по одному полю (по убыванию): Добавьте минус (
-) перед именем поля.# Сортировка статей по дате создания (от новых к старым) articles = Article.objects.order_by('-created_at') -
Сортировка по нескольким полям: Передайте несколько имен полей в
order_by(). Сортировка будет выполняться последовательно.# Сортировка товаров сначала по категории (возрастание), затем по цене (убывание) products = Product.objects.order_by('category', '-price') -
Сортировка по связанным полям (JOIN): Используйте синтаксис
__для доступа к полям связанных моделей.# Сортировка комментариев по имени автора comments = Comment.objects.order_by('author__username')
Сортировка по умолчанию в модели:
Вы можете определить порядок сортировки по умолчанию для модели, используя опцию ordering во вложенном классе Meta модели. Это будет применяться ко всем QuerySet, если явно не переопределено.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
published_date = models.DateTimeField(auto_now_add=True)
class Meta:
# Сортировка по умолчанию: от новых постов к старым
ordering = ['-published_date', 'title']
# Теперь Post.objects.all() будет отсортирован по published_date DESC, затем по title ASC
posts = Post.objects.all()
Отмена сортировки:
Чтобы отменить любую предыдущую сортировку (включая сортировку по умолчанию из Meta.ordering), вызовите order_by() без аргументов или с None.
# Отменяет любую сортировку и возвращает QuerySet без определенного порядка
queryset = MyModel.objects.order_by()
# Или
queryset = MyModel.objects.order_by(None) Ответ 18+ 🔞
Смотри, вот тебе про эту вашу сортировку в Django, блядь. Ну, то есть, как там у вас эти записи по порядку выстраивать, чтобы не как попало, а по уму.
В общем, есть у них там такой метод order_by(), сука. Он берёт твой QuerySet и наводит в нём марафет, как мать родная. А в базе данных он превращается в эту самую SQL-шную команду ORDER BY. Ну, ты понял.
Вот как этим делом пользоваться, чтобы не облажаться:
-
Просто по одному полю, от меньшего к большему: Просто пишешь название поля в скобках, и всё, пиздец.
# Ну, сортируем юзеров по нику, от А до Я, как в телефонной книге, блядь. users = User.objects.order_by('username') -
А если наоборот, от большего к меньшему, надо? Да хуй с ним, легко. Ставишь минусик перед названием поля, и поехали.
# Статьи по дате, чтобы самые свежие сверху были, а не эту древнюю хуйню. articles = Article.objects.order_by('-created_at') -
А если сразу по двум полям? Да похуй, перечисляй через запятую. Сначала по первому отсортирует, потом, если одинаковые, по второму прижмёт.
# Товары: сначала по категории, а внутри категории — от дорогих к дешёвым, чтобы денег с дураков побольше содрать. products = Product.objects.order_by('category', '-price') -
А если поле не в этой таблице, а в соседней, через связь? О, ёпта, тут уже интереснее. Используй двойное подчёркивание
__, как мост, блядь.# Комментарии сортируем по имени того, кто их написал. Автор__юзернейм — и пошло-поехало. comments = Comment.objects.order_by('author__username')
А можно сделать так, чтобы ВСЕГДА по умолчанию сортировалось?
Можно, сука! Для этого в самой модели, в этом её внутреннем классе Meta, есть опция ordering. Туда пишешь список полей, и теперь любой запрос к этой модели будет уже причёсанный.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
published_date = models.DateTimeField(auto_now_add=True)
class Meta:
# Вот так, блядь. Сначала свежие посты, а если дата одинаковая — то по алфавиту заголовка.
ordering = ['-published_date', 'title']
# И теперь Post.objects.all() уже сразу идёт отсортированным. Удобно, ёбана!
posts = Post.objects.all()
А если я эту сортировку по умолчанию, нахуй, отменить хочу?
Бывает, блядь, не всегда же по плану. Тогда вызываешь order_by() просто так, без ничего, или с None. Всё, сортировка слетела, как шляпа с головы пьяного.
# Вернёт всё как бог на душу положит, в том беспорядке, в каком в базе лежит.
queryset = MyModel.objects.order_by()
# Или вот так, тоже работает.
queryset = MyModel.objects.order_by(None)
Вот и вся магия, ебать мои старые костыли. Главное — не перепутай, где минус ставить, а то получишь всё задом наперёд, и потом удивляешься, почему у тебя в админке старьё сверху.