Запись приобретения отдельного товара

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 и храните цену покупки отдельно от изменяемой цены товара. Одна пара клиент–товар может встречаться многократно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее