Атрибут ordering
Атрибут ordering внутри класса Meta модели Django задаёт порядок сортировки записей по умолчанию. Он применяется ко всем запросам к данной модели, если явно не указан другой порядок через метод order_by. Атрибут принимает список строк, где каждая строка - это имя поля, по которому выполняется сортировка. Для сортировки по убыванию перед именем поля ставится знак минуса. Также поддерживаются случайная сортировка и сортировка по связанным полям.
Синтаксис
class MyModel(models.Model):
field1 = models.CharField(max_length=100)
field2 = models.IntegerField()
class Meta:
ordering = ['field1', '-field2']
Пример
Рассмотрим модель статьи, у которой есть поле для статуса и даты публикации. Определим сортировку сначала по статусу, а затем по дате публикации в порядке убывания:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
status = models.CharField(max_length=20)
published_at = models.DateTimeField()
class Meta:
ordering = ['status', '-published_at']
def __str__(self):
return self.title
Теперь при получении всех статей они будут автоматически отсортированы сначала по полю 'status' в порядке возрастания, а затем по полю 'published_at' в порядке убывания:
from myapp.models import Article
articles = Article.objects.all()
for article in articles:
print(article.title, article.status, article.published_at)
Результат выполнения кода:
"Article 1 draft 2025-01-10 10:00:00"
"Article 2 draft 2025-01-08 15:30:00"
"Article 3 published 2025-01-15 12:00:00"
"Article 4 published 2025-01-12 09:00:00"
Пример
Атрибут ordering также поддерживает сортировку по связанным полям. Рассмотрим модель автора и статьи, где статьи сортируются по имени автора и дате публикации:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_at = models.DateTimeField()
class Meta:
ordering = ['author__name', '-published_at']
При запросе всех статей они будут отсортированы сначала по имени автора в алфавитном порядке, а затем по дате публикации от новых к старым:
from myapp.models import Article
articles = Article.objects.all()
for article in articles:
print(article.title, article.author.name, article.published_at)
Результат выполнения кода:
"Article A Alex 2025-01-20 14:00:00"
"Article B Alex 2025-01-18 11:30:00"
"Article C Maria 2025-01-22 16:00:00"
"Article D Maria 2025-01-19 09:00:00"
Пример
Для случайной сортировки используется специальное значение '?'. Это может быть полезно для вывода случайных записей, но следует учитывать, что для больших таблиц это может быть ресурсоёмкой операцией:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
ordering = ['?']
def __str__(self):
return self.name
Теперь каждый раз при запросе продуктов они будут возвращаться в случайном порядке:
from myapp.models import Product
random_products = Product.objects.all()
for product in random_products:
print(product.name, product.price)
Результат выполнения кода:
"Product C 99.99"
"Product A 49.99"
"Product B 149.99"
Смотрите также
-
атрибут
db_table,
который задаёт имя таблицы в базе данных -
атрибут
verbose_name,
который задаёт человекочитаемое имя модели -
атрибут
verbose_name_plural,
который задаёт множественное имя модели -
метод
order_by,
который позволяет переопределить сортировку при запросе