Создайте Purchase с проверенными user_id, product_id и количеством. В DRF пользователь определяется авторизацией или серверными полномочиями, а не произвольным ID клиента.
API‑endpoint для регистрации покупки товара
Создайте Purchase с проверенными user_id, product_id и количеством. В DRF пользователь определяется авторизацией или серверными полномочиями, а не произвольным ID клиента.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать представление на Django REST Framework, которое будет фиксировать факт покупки продукта пользователем. На входе уже получены проверенные идентификаторы продукта и пользователя (например, prod_id и usr_id). Задача – создать запись в модели Purchase, отражающую, что данный пользователь приобрёл указанный товар.
class User(db.Models):
name = models.CharField(
max_length=256,
blank=True,
default="",
verbose_name="Имя"
)
class Product(db.Models):
name = models.CharField(
max_length=256,
blank=True,
default="",
verbose_name="Название"
)
price = models.DecimalField()
class Purchase(db.Models):
user = models.ForeignKey(
model=User,
related_name="purchase",
on_delete=models.CASCADE
)
product = models.ForeignKey(
model=Product,
related_name="purchase",
on_delete=models.CASCADE
)
count_products = models.IntegerField(default=1)
Ответ
Создайте Purchase с проверенными user_id, product_id и количеством. В DRF пользователь определяется авторизацией или серверными полномочиями, а не произвольным ID клиента.
Пример минимального endpoint, если создание покупки уже разрешено бизнес-правилами:
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import Product, Purchase
class PurchaseView(APIView):
permission_classes = [IsAuthenticated]
def post(self, request, prod_id):
product = get_object_or_404(Product, pk=prod_id)
purchase = Purchase.objects.create(
user_id=request.user.pk, product=product, count_products=1,
)
return Response({'id': purchase.pk}, status=201)
В исходных моделях нужны models.Model, ForeignKey(User, ...) и параметры max_digits/decimal_places у DecimalField. Этот endpoint не подтверждает оплату: реальный платёж проверяется отдельно, повторное создание защищают идемпотентностью.