Создание моделей в Django для онлайн-магазина
Навигация по проекту |
|
Справочник моделей Django |
Проект Django представляет собой группу отдельных приложений, совместная работа которых обеспечивает работу проекта в целом. В первом разделе мы создали проект и базу данных. Теперь пришло время создать приложения. Создадим модели для каталогов товара и модель описания продукта с фотографией.
Содержание страницы: |
1. Создания приложения shop
Создадим приложение shop, в котором разместим модели категории товаров и описание продукта. В начале откройте консоль и активируйте виртуальное окружение, которое создали в предыдущем разделе с проектом Django. Новое приложение в проекте my_site создается с помощью команды django-admin startapp:
(ms_env) my_site\my_site>django-admin startapp shop
Shop - это название нашего приложения. Теперь чтобы Django отслеживал наше приложение, его нужно активировать. Перейдите в файл settins.py проекта и добавьте новое приложение в список INSTALLED_APPS:
INSTALLED_APPS = [
'shop.apps.ShopConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Ваше приложение создано и подключено к проекту.
2. Определение моделей каталога товаров
В магазине в основном все товары разделены по категориям, например, одежда, обувь и т.д. Создадим модель Category и добавим ее в файл models.py нашего приложения shop.
from django.db import models
from django.urls import reverse
class Category(models.Model):
"""Категории, к которым относятся товары"""
name = models.CharField(max_length=150, db_index=True, verbose_name='Название категории')
slug = models.SlugField(max_length=150, unique=True)
class Meta:
ordering = ('name',)
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:product_list_by_category', args=[self.slug])
Мы создали класс с именем Category, который наследуется от базового класса Model, включенного в Django и определяющего базовую функциональность модели. Класс Category состоит из:
- name - название категории. Атрибут name содержит данные CharField - строковое поле ограниченной длины. Параметр max_length - указывает максимальную длину поля, db_index=True - в базе данных будет создан индекс, verbose_name - "человеческое" название поля, которое будет выводиться на веб-страницах.
- slug - тип поля SlugField. это поле служит для построения удобочитаемых URLов. Слаг может содержать только буквы, цифры, нижнее подчеркивания или дефисы.
- class Meta вкладывается в класс Category и хранит дополнительную информацию по управлению модели. ordering - сортирует значения по имени name. verbose_name и verbose_name_plural приказывает Django использовать единственного и множественного числа при обращении к имени "Категория", полезно будет использовать на административном сайте Django.
- Метод __str__ возвращает строковое представление Category - ее название.
- Метод get_absolute_url - возвращает канонический URL объект. Для реализации используется функция reverse, которую мы импортировали в начале кода. В HTML шаблона мы будем использовать метод get_absolute_url, чтобы получать ссылки на отображение страниц.
Теперь создадим модель Product, которая будет описывать какой-либо товар, относящийся к созданной категории (Category). Добавим ее тоже в файл models.py нашего приложения shop.
class Product(models.Model):
"""Модель описания продукта"""
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE,
verbose_name='Выберите категорию'
)
name = models.CharField(max_length=200, db_index=True, verbose_name='Наменование')
slug = models.SlugField(max_length=200, db_index=True)
image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True, verbose_name='Фото')
description = models.TextField(blank=True, verbose_name='Описание')
price = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='Цена')
available = models.BooleanField(default=True, verbose_name='Наличие')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('name',)
index_together = (('id', 'slug'),)
verbose_name = 'Продукт'
verbose_name_plural = 'Продукты'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:product_detail', args=[self.id, self.slug])
- category - является экземпляром ForeignKey, содержит ключ на другую запись в базе данных, в нашем случае на Category. Все создаваемые продукты будут относится к какой-нибудь категории. on_delete=models.CASCADE - сообщает Django, что при удалении категории, будут удаляться все продукты, относящиеся к данной категории. related_name='products' - указывает имя обратной связи, так мы легко получим доступ ко всем продуктам категории.
- name - название продукта. Содержит данные CharField - строковое поле ограниченной длины, в нашем случае максимум 200 символов.
- slug - служит для построения удобочитаемых URLов.
- image - фотография товара. Так как в параметрах стоит blank=True, значит поле не обязательно к заполнению.
- description - описание вашего продукта
- price - цена товара. Тип поля DecimalField, которое хранит значение с фиксированной точностью. Парамаетр max_digits задает общее количество цифр, включая десятичные, decimal_places - количество цифр после запятой.
- available - наличие товара на складе. Тип BooleanField, так как есть два варианта True - в наличие, False - отсутствует на складе.
- created - дата и время создания товара
- updated - дата и время последнего изменения
Класс Meta, метод __str__ и get_absolute_url несут такой же функционал, как и в модели Category.
Так как наша модель Product содержит поле для изображения, необходимо установить пакет Pillow. Сделать это можно с помощью команды:
pip install pillow
Так как мы добавили новые модели, необходимо снова провести миграцию базы данных. При изменении файла models.py, вы выполняете команду python manage.py makemigrations, а затем команду python manage.py migrate.
(ms_env) my_site\my_site>python manage.py makemigrations
Migrations for 'shop':
shop\migrations\0001_initial.py
- Create model Category
- Create model Product
(ms_env) my_site\my_site>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, shop
Running migrations:
Applying shop.0001_initial... OK
Первой командой генерируется новая миграция 0001_initial.py, которая сообщает Django как изменить базу данных. Второй командой Django подтверждает, что миграция прошла успешно.
Далее: Административный сайт Django
Назад: Создание проекта в Django