Создание корзины покупок в Django Rest Framework

Я хочу реализовать корзину покупок в Django Rest Framework. Я храню информацию о корзине внутри моделей. Я не хочу использовать для этого сессию и хочу сохранить ее в базе данных. Пользователи должны быть зарегистрированы в системе, чтобы создавать и добавлять товары в корзину. Но я хочу, чтобы они могли добавить товар в корзину без входа в систему. Я буду очень благодарен, если вы сможете мне помочь. Спасибо

My Model :

class Cart(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)    
    quantity = models.PositiveIntegerField()

 My View:        

  

class AddToCartApi(APIView):
    serializer_class = AddToCartSerializer
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)

        user_id = request.user.id
        data = serializer.validated_data
        
        Cart.objects.create(
            user_id=user_id,
            product_id=data['product_id'],
            quantity=data['quantity'],                
        )
        return Response(....)

Ну, в сценариях, где вы хотите, чтобы пользователи добавляли/обновляли корзину без регистрации :

Решение 1: Вы должны реализовать то же самое на стороне клиента, т.е. если ваш клиент взаимодействует через веб-браузер, вы можете использовать локальное/сеансовое хранилище. Позже, когда пользователь войдет в систему, вы сможете сохранить всю информацию в базе данных.

Чтобы создать корзину в Django Rest Framework, вы можете выполнить следующие шаги:

1) Определите модель Cart для хранения товаров в корзине. Модель должна содержать поля для пользователя, продукта и количества. Вы также можете добавить поля для промежуточного итога, общей суммы и любой другой информации, которую вам нужно хранить.

# carts/models.py

from django.db import models

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()
    subtotal = models.DecimalField(max_digits=10, decimal_places=2)
    total = models.DecimalField(max_digits=10, decimal_places=2)

2)Создайте класс сериализатора для модели Cart для обработки сериализации и десериализации данных корзины.

# carts/serializers.py

from rest_framework import serializers

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = '__all__'

3) Создайте набор представлений и маршрутизатор для модели Cart для обработки конечных точек API.

# carts/views.py

from rest_framework import viewsets

class CartViewSet(viewsets.ModelViewSet):
    queryset = Cart.objects.all()
    serializer_class = CartSerializer


# carts/urls.py

from django.urls import include, path
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'carts', CartViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

4) Реализуйте конечные точки API для добавления товаров в корзину, обновления количества и удаления товаров из корзины. Вы можете использовать действия создания, обновления и уничтожения ModelViewSet для обработки этих операций.

# carts/views.py

class CartViewSet(viewsets.ModelViewSet):
    queryset = Cart.objects.all()
    serializer_class = CartSerializer

    def create(self, request, *args, **kwargs):
        # Create a new cart item
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def update(self, request, *args, **kwargs):
        # Update the quantity of an existing cart item
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self
Вернуться на верх