自定义视图集不允许使用POST方法

问题描述 投票:0回答:1

如果我要将产品添加到购物车,则会出错。不允许使用POST方法

views.py

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


@action(methods=['post', 'put'], detail=False)
def add_to_cart(self, request, pk=None):

    cart = self.get_object()
    try:
        cart.user = self.request.user
        product = Product.objects.get(pk=request.data['product'])
        quantity = int(request.data['quantity'])
    except Exception as e:
        print(e)
        return Response({'status': 'fail'})

    if product.inventory <= 0 or product.inventory - quantity < 0:
        print('There is no inventory in store')

        return Response({'status': 'fail'})

    existing_cart_item = CartItem.objects.filter(cart=cart, product=product).first()

    if existing_cart_item:
        existing_cart_item.quantity += quantity
        existing_cart_item.save()

    else:
        new_cart_item = CartItem(cart=cart, product=product, quantity=quantity)
        new_cart_item.save()

    serializer = CartSerializer(cart)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

urls.py

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



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

[当我给我类似carts/1/add_to_cart的网址时,它起作用了,在这里我给出了购物车ID,但是在我的情况下,这是错误的,因为创建用户时也会创建购物车,这就是用户名和购物车ID相同的原因。我不愿在URL中提供购物车ID,因为我将令牌放在Postman的“授权”部分中,由此可以检测到哪个用户正在发送发布请求。如上所示,我添加了cart.user=self.request.user,但仍无法正常工作。我该如何解决这个问题?任何帮助,将不胜感激)

django python-3.x python-2.7 django-models django-rest-framework
1个回答
0
投票

所以您的问题不是“不允许使用post方法”

您想做这样的事情:

[POST,PUT] carts/add_to_cart 

并且这应该将项目添加到用户的购物车。

我认为对于该操作,ModelViewSet并不是很好的视图选择(以您想要的方式)。

我将创建一个新视图来处理此问题,并保留视图集来处理购物车操作。

因此,从您的视图中删除add_to_cart方法。

您可以这样创建视图:

class CartUpdateView(generics.UpdateAPIView):

    queryset = None
    serializer_class = CartUpdateSerializer

    def get_object(self):
        return self.request.user.cart

为此端点注册此视图(即使我会以不同的方式构造端点):

path("cart/add_to_cart", CartUpdateView.as_view())

并创建CartUpdateSerializer将商品添加到购物车(就像在add_to_cart中所做的一样,但是in将在序列化器中)。

并且即使您同时创建ID,也不要依赖Cart和User具有相同的ID。不保证。

© www.soinside.com 2019 - 2024. All rights reserved.