РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
132 of 818 menu

Атрибут 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,
    который позволяет переопределить сортировку при запросе
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить