API‑endpoint для регистрации покупки товара

Создайте Purchase с проверенными user_id, product_id и количеством. В DRF пользователь определяется авторизацией или серверными полномочиями, а не произвольным ID клиента.

Короткий ответ

Что ответить на собеседовании

Создайте 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 не подтверждает оплату: реальный платёж проверяется отдельно, повторное создание защищают идемпотентностью.

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

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

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

Подробнее