Django 5 для начинающих

Прогресс по курсу:  9/1004

5.2 Создание моделей данных блога
4 из 9 шагов пройдено
0 из 21 баллa  получено

Определение предустановленного порядка сортировки

Посты блога обычно отображаются на странице в обратном хронологическом порядке (от самых новых к самым старым).

В нашей модели мы определим заранее заданный порядок. Он будет применяться при извлечении объектов из базы данных, в случае если в запросе порядок не будет указан.

Отредактируйте файл models.py приложения blog, придав ему следующий вид:

from django.db import models
from django.utils import timezone


class Post(models.Model):
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True)
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-publish']

    def __str__(self):
        return self.title

Внутрь модели был добавлен класс Meta. Этот класс определяет метаданные модели.

Мы используем атрибут ordering, сообщающий Django, что он должен сортировать результаты по полю publish.

Указанный порядок будет применяться по умолчанию для запросов к базе данных, когда в запросе не указан конкретный порядок.

Убывающий порядок задается с помощью дефиса перед именем поля: -publish.

По умолчанию посты будут возвращаться в обратном хронологическом порядке.

Добавление индекса базы данных

Давайте определим индекс базы данных по полю publish.
Индекс повысит производительность запросов, фильтрующих или упорядочивающих результаты по указанному полю.

Мы ожидаем, что многие запросы извлекут преимущества из этого индекса, поскольку для упорядочивания результатов мы по умолчанию используем поле publish.

Отредактируйте файл models.py приложения blog, придав ему следующий вид:

from django.db import models
from django.utils import timezone


class Post(models.Model):
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True)
    body = models.TextField()

    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-publish']
        indexes = [
            models.Index(fields=['-publish']),
        ]

    def __str__(self):
        return self.title

В класс Meta модели была добавлена опция indexes.

Указанная опция позволяет определять в модели индексы базы данных, которые могут содержать одно или несколько полей в возрастающем либо убывающем порядке, или функциональные выражения и функции базы данных.

Был добавлен индекс по полю publish, а перед именем поля применен дефис, чтобы определить индекс в убывающем порядке. Создание этого индекса будет вставляться в миграции базы данных, которую мы сгенерируем позже для моделей блога.

Дополнительная информация о том, как определять индексы в моделях, находится на странице https://docs.djangoproject.com/en/5.0/ref/models/indexes/

 

Добавление поля статуса

Очень часто в функциональность ведения блогов входит хранение постов в виде черновика до тех пор, пока они не будут готовы к публикации.

Мы добавим в модель поле статуса, которое позволит управлять статусом постов блога.
В постах будут использоваться статусы Draft(Черновик) и Published(Опубликован).

Отредактируйте файл models.py приложения blog, придав ему следующий вид:

from django.db import models
from django.utils import timezone


class Post(models.Model):
    class Status(models.TextChoices):
        DRAFT = 'DF', 'Draft'
        PUBLISHED = 'PB', 'Published'

    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True)
    body = models.TextField()

    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=2, choices=Status.choices, default=Status.DRAFT)

    class Meta:
        ordering = ['-publish']
        indexes = [
            models.Index(fields=['-publish']),
        ]

    def __str__(self):
        return self.title

Мы определили перечисляемый класс Status путем подкласса models.TextChoices.

Доступными вариантами статуса поста являются DRAFT и PUBLISHED. Их соответствующими значениями выступают DF и PB, а их метками или читаемыми именами являются Draft и Published.

Django предоставляет перечисляемые типы, которые можно подклассировать, чтобы легко и просто определять варианты выбора. Они основаны на объекте enum стандартной библиотеки Python. Подробнее об enum можно почитать на странице https://docs.python.org/3/library/enum.html.

Перечисляемые типы Django имеют несколько видоизменений по сравнению с enum. Об этих различиях можно узнать по адресу https://docs.djangoproject.com/en/5.0/ref/models/fields/#enumeration-types.

Для того чтобы получать имеющиеся варианты, можно обращаться к вариантам статуса Post.Status.choices, для того чтобы получать удобочитаемые имена – к меткам статуса Post.Status.labels, и для того чтобы получать фактические значения вариантов – к значениям статуса Post.Status.values.

В модель также было добавлено новое поле status, являющееся экземпляром типа CharField. Оно содержит параметр choices, чтобы ограничивать значение поля вариантами из Status.choices.

Кроме того, применяя параметр default, задано значение поля, которое будет использоваться по умолчанию. В этом поле статус DRAFT используется в качестве предустановленного варианта, если не указан иной.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Все таки перечисления, в виде текущего поля статуса, из другого курса пригодились, а казались юзалесс ерундой))