Создание моделей каталога продуктов

Каталог нашего магазина будет состоять из продуктов, сгруппированных по разным категориям. Каждый продукт будет иметь имя, необязательное описание, необязательное изображение, цену и доступный запас. Отредактируйте файл models.py только что созданного приложения shop и добавьте следующий код:

from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

    def __str__(self):
        return self.name


class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

Это модели Category и Product. Модель Category состоит из поля name и slug. Рассмотрим поля модели Product:

  • category : Это ForeignKey модели Category. Это отношение "многие к одному": продукт относится к одной категории, а категория содержит несколько продуктов
  • name : Название продукта.
  • slug : Алиас продукта(его URL).
  • image : Изображение продукта.
  • description : Необязательное описание для продукта.
  • price : Это поле DecimalField. В нем используется десятичное число Python. Десятичный тип для хранения десятичного числа с фиксированной точностью. Максимальное число цифр (включая десятичные разряды) задается с помощью атрибута max_digits и десятичных знаков с атрибутом decimal_places
  • stock : Это поле PositiveIntegerField для хранения остатков данного продукта.
  • available : Это булево значение, указывающее, доступен ли продукт или нет. Позволяет включить/отключить продукт в каталоге.
  • created : Это поле хранит дату когда был создан объект.
  • updated : В этом поле хранится время последнего обновления объекта.

Для поля price мы используем DecimalField вместо FloatField, чтобы избежать проблем округления.

Всегда используйте DecimalField для хранения денежных сумм. FloatField использует плавающий тип Python внутри, в то время как DecimalField использует десятичный тип Python. С помощью десятичного типа можно избежать проблем с округлением с плавающей точкой.

В классе Meta модели Product мы используем параметр мета index_together, чтобы задать индекс для полей id и slug. Мы определим этот индекс, поскольку мы планируем запросить продукты с помощью id и slug. Оба поля индексируются вместе для улучшения представлений для запросов, использующих эти два поля.

Поскольку мы собираемся использовать изображения в наших моделях, откройте терминал и установите Pillow следующей командой:

pip install Pillow==2.9.0

Теперь выполните следующую команду, чтобы создать начальные миграции для проекта:

python manage.py makemigrations

Вы увидите следующее:

Migrations for 'shop':
    0001_initial.py:
    - Create model Category
    - Create model Product
    - Alter index_together for product (1 constraint(s))

Выполните следующую команду для синхронизации базы данных:

python manage.py migrate

Вы увидите следующее:

Applying shop.0001_initial... OK

Теперь база данных синхронизирована с моделями.

results matching ""

    No results matching ""