Простой блог на Django - часть 3. Создание сущности. Добавление простых и внешних полей в модель.
Несмотря на то, что у нас создан сам каркас приложения, и мы можем уже начать писать какой-либо код, в реальной жизни всё обстоит так, что нам удобнее работать именно с какими-либо сущностями. Если рассматривать всё это с точки зрения интернет-магазина, то это будет сущность "категория" и собственно сущность "товар". Если это блог, то уже речь будет идти о разделении на "посты", "категории" и "тэги". Так вот, в Django такие сущности принято разделять на своего рода мини-приложения - другими словами приложения, внутри нашего главного приложения. И вот одно из таких приложений мы как раз сейчас и создадим.
Создание приложения внутри приложения
Заходим в папку нашего основного приложения (по аналогии с уроком по созданию приложения, это папка newapp/newapp) и даём следующую команду:
python manage.py startapp posts
Конечно в вашем случае это может быть products или categories. Тут уж смотрите по ситуации, главное не забудьте потом зарегистрировать это приложение в файле settings.py
Добавление простых полей
Код моделей хранится в файле models.py сущности. Значит если мы хотим добавить какие-то дополнительные поля в нашу сущность, то редактируем файл /newapp/posts/models.py
Давайте дополним его следующим образом:
class Post(models.Model):
title = models.CharField(
max_length=200, null=True,
)
text = models.TextField()
pub_date = models.DateTimeField("date published", auto_now_add=True)
Это означает, что в таблице нашей сущности будут созданы соответствующие поля с тем типом, который указан в описании модели.
CharField - будет рендериться поле типа "text",
TextField - будет рендериться поле типа "textarea",
DateTimeField - поле типа "дата".
Добавление внешних полей
Что такое внешние поля, пожалуй лучше будет объяснить на примере поля, которое будет ссылаться на автора поста, то есть на таблицу User. Но сперва эту сущность нужно получить, сделать это можно так:
from django.contrib.auth import get_user_model
User = get_user_model()
Тогда чтобы создать поле, которое будет ссылаться на автора, нашу модель нужно будет дополнить следующим образом:
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
Здесь явно указано что поле является внешним ключом (ForeignKey) и ссылается оно на сущность User. Благодаря параметру related_name="posts", теперь в модели User будет создано свойство posts, с помощью которого можно будет получить все посты пользователя. Параметр on_delete=models.CASCADE означает, что если из таблицы User будет удалён пользователь, то будут так же удалены все связанные с ним посты.
Полный код будет выглядеть так:
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
title = models.CharField(
max_length=200, null=True,
)
text = models.TextField()
pub_date = models.DateTimeField("date published", auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
Ну а дальше, как и рассказывалось в заметке по миграциям, используем две команды:
python manage.py makemigrations - создание миграции;
python manage.py migrate - применение.
Список изменений можно посмотреть здесь: https://github.com/maclen2007/simple_django_blog/commit/4c06e02eefbc4200b9de856c7699587910473fb7 Хочу обратить ваше внимание, что в этом коммите не учитывается большинство файлов, которые были созданы автоматически при создании приложения или применении миграций. По факту, изменения вносились только в файлы settings.py и models.py
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()