Purchase с двумя ForeignKey и quantity фиксирует покупку товара клиентом. Исправьте базовый класс на models.Model, задайте параметры DecimalField и ограничьте quantity значениями не меньше 1.
Запись приобретения отдельного товара
Purchase с двумя ForeignKey и quantity фиксирует покупку товара клиентом. Исправьте базовый класс на models.Model, задайте параметры DecimalField и ограничьте quantity значениями не меньше 1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо расширить существующие модели Customer и Item:
- Создать промежуточную модель, фиксирующую факт покупки конкретного товара конкретным пользователем;
- В модели покупки добавить поле, указывающее количество приобретённых единиц (например, 2 штуки одного продукта).
class Customer(db.Models):
full_name = models.CharField(
max_length=256,
blank=True,
default="",
verbose_name="Имя"
)
class Item(db.Models):
title = models.CharField(
max_length=256,
blank=True,
default="",
verbose_name="Название"
)
cost = models.DecimalField()
class Purchase(db.Models):
buyer = models.ForeignKey(Customer, on_delete=models.CASCADE)
product = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1)
Ответ
Purchase с двумя ForeignKey и quantity фиксирует покупку товара клиентом. Исправьте базовый класс на models.Model, задайте параметры DecimalField и ограничьте quantity значениями не меньше 1.
Основные поля промежуточной модели:
from django.db import models
from django.core.validators import MinValueValidator
class Purchase(models.Model):
buyer = models.ForeignKey('Customer', on_delete=models.PROTECT)
product = models.ForeignKey('Item', on_delete=models.PROTECT)
quantity = models.PositiveIntegerField(
default=1, validators=[MinValueValidator(1)]
)
class Meta:
constraints = [models.CheckConstraint(
condition=models.Q(quantity__gte=1), name='purchase_qty_positive'
)]
Пример использует современный синтаксис Django и PROTECT для сохранения истории; каскадное удаление допустимо только по явному правилу. PositiveIntegerField допускает ноль, поэтому нужен CHECK. Для цены задайте max_digits/decimal_places и храните цену покупки отдельно от изменяемой цены товара. Одна пара клиент–товар может встречаться многократно.