uchiha itachi
uchiha itachi

Reputation: 195

Add product to a cart django rest framework

How can make an endpoint for adding product into a cart using django rest framework? I have searched everywhere and couldn't find. Could you help me please?

This is my products.views:

class ProductDetail(generics.RetrieveAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer


class AddProduct(ProductDetail, ListCreateApiView):
    serializer_class = AddToCartSerializer

    @require_POST
    def get(self, request):
        cart_obj = Cart.objects.get_or_new(request)
        product_id = request.POST.get('product_id')
        qs = Product.objects.filter(id=product_id)
        if qs.count() == 1:
            product_obj = qs.first()
            if product_obj not in cart_obj.products.all():
                cart_obj.products.add(product_obj)
            else:
                cart_obj.products.remove(product_obj)
            request.session['cart_items'] = cart_obj.products.count()
        return Response(status=status.HTTP_200_OK, data={'message': 'Product has been added to cart'})

serializers.py

class ProductSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Product
        fields = ('url', 'id', 'title', 'description',
                  'category', 'price', 'quantity',
                  'in_stock', 'color')


class AddToCartSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = ('id',)

Upvotes: 1

Views: 2109

Answers (1)

uchiha itachi
uchiha itachi

Reputation: 195

I wrote this function and it works. But I can't control the number of products to add into the cart

class ProductDetail(generics.RetrieveAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer


class AddProduct(ProductDetail, viewsets.ModelViewSet):

    @action(detail=True, methods=['post'])
    def add_to_cart(self, request, pk):
        cart_obj = Cart.objects.get_or_new(request)
        product_id = pk
        qs = Product.objects.filter(id=product_id)
        if qs.count() == 1:
            product_obj = qs.first()
            if product_obj not in cart_obj.products.all():
                cart_obj.products.add(product_obj)
            else:
                cart_obj.products.remove(product_obj)
            request.session['cart_items'] = cart_obj.products.count()
        return Response(status=status.HTTP_200_OK, data={'message': 'Product has been added to cart'})

Upvotes: 1

Related Questions