Блог на Django #6: Разработка схемы блога

Начинать разработку дизайна схемы блога необходимо с определения моделей данных блога. Модель — это класс в Python, представляющий собой подкласс django.db.models.Model,_ в котором каждый атрибут — это поле базы данных. Django создаст таблицу для каждой модели, определенной в файле models.py. При создании модели Django предоставляет практический API, с помощью которого легко делать запросы к объектам в базе данных.

В первую очередь необходимо определить модель Post. Для этого в файл models.py приложения blog нужно добавить следующие строки:

from django.db import models 
from django.utils import timezone 
from django.contrib.auth.models import User 

class Post(models.Model): 
    STATUS_CHOICES = (
        ('draft', 'Draft'), 
        ('published', 'Published'), 
    ) 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250, 
                            unique_for_date='publish') 
    author = models.ForeignKey(User, 
                               on_delete=models.CASCADE, 
                               related_name='blog_posts') 
    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=10, 
                              choices=STATUS_CHOICES, 
                              default='draft') 

    class Meta: 
        ordering = ('-publish',) 

    def __str__(self): 
        return self.title

Это модель данных для постов блога. Рассмотрим подробно каждый из полей в этой модели:

  • title — поле для заголовка поста. Это поле CharField, которое переводится в колонку VARCHAR в базе данных SQL.

  • slug — это поле используется в URL. Это короткий маркер, включающий только буквы, числа, нижние подчеркивания и дефисы. Он нужен для создания красивых URL, подходящих для SEO. Для этого поля также добавлен параметр unique_for_date, так что для постов будет использоваться дата их публикации вместе со slug. Django не позволит использовать один и тот же slug для нескольких постов в один день.

  • author — это поле представлено внешним ключом, определенным отношением многие к одному. Мы сообщаем Django, что каждый пост написан пользователем, и пользователь может написать любое количество постов. Для этого поля Django создаст внешний ключ в базе данных, основываясь на основном ключе связанной модели. В этом случае опираемся на модель User из системы аутентификации Django. Параметр on_delete определяет поведение, когда объект, на который ссылаются, оказывается удален. Это из стандартов SQL. С помощью CASCADE можно указать, что если пользователь удаляется, система удалит и все связанные с ним записи из блога. Все возможные варианты представлены здесь https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete. Определить обратное отношение, от User к Post можно с помощью атрибута related_name. Это позволит легко получать доступ к связанным объектам. Речь об этом в подробностях пойдет дальше.

  • body — тело поста. Это текстовое поле, которое переводится в колонку TEXT в базе данных SQL.

  • publishdatetime определяет, когда пост был опубликован. По умолчанию используется метод now из timezone Django. Возвращаются текущие дата и время с учетом часового пояса. Этот подход напоминает метод datetime.now стандартной версии Python.

  • created — datetime указывает, когда пост был создан. Поскольку используется auto_now_add, дата сохранится автоматически при создании объекта.

  • updated — datetime указывает, когда пост был обновлен в последний раз. Поскольку используется auto_now, дата сохранится автоматически при обновлении объекта.

  • status — показывает статус поста. Используется параметр choices, поэтому значение поля может быть одним из представленных вариантов.

В Django есть несколько типов полей, которые можно использовать для моделей. Все эти типы полей перечислены здесь: https://docs.djangoproject.com/en/2.0/ref/models/fields/.

Класс Meta в модели содержит мета-данные. По умолчанию Django будет сортировать результаты в поле publish в обратном хронологическом порядке при запросе к базе данных. Обратный хронологический порядок задается с помощью отрицательного индекса. В таком случае новые посты будут появляться первыми.

Метод __str__() — это версия объекта в человекочитаемой форме. Django будет использовать ее во многих местах, например в административном сайте.

Если ранее вы пользовались Python 2.X, обратите внимание, что в_ Python 3 все строки по умолчанию закодированы в Unicode, поэтому используется метод __str__(). Метод __unicode__() устарел.