如果我要将产品添加到购物车,则会出错。不允许使用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
,但仍无法正常工作。我该如何解决这个问题?任何帮助,将不胜感激)
所以您的问题不是“不允许使用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。不保证。