Начинать разработку дизайна схемы блога необходимо с определения моделей данных блога. Модель — это класс в 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.publish
— datetime определяет, когда пост был опубликован. По умолчанию используется метод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__()
устарел.