如何在Django Rest框架中更新数据

问题描述

我有一个购物车模型,我想在API中使用,如果用户在购物车中两次添加相同的商品,则购物车会自动增加服务量。就我而言,如果我添加相同的项目两次,它将创建另一个购物车,而不是更新前一个。我搜索了很多,但没有得到答案。我为此做了很多尝试。如果有人有能力给出答案,请给出答案
这是我的代码:-

views.py

class CartViewSet(viewsets.ModelViewSet):
    serializer_class = CartSerializer
    permission_classes = (IsAuthenticated,)
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser or user.is_Customer:
                    return Cart.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['date_created','user']
    @action(detail=False)
    def count(self,request):
        queryset = self.filter_queryset(self.get_queryset())
        count = queryset.count()
        content = {'count': count}
        return Response(content)

serializers.py

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = ['id','url','user','service','defects','date_created','quantity','price','total']

models.py

class Cart(models.Model):
    user = models.ForeignKey('accounts.User',related_name="carts",null=True,on_delete=models.SET_NULL)
    quantity = models.IntegerField(default=1)
    service = models.ForeignKey('accounts.SubCategory',on_delete=models.SET_NULL)
    defects = models.ForeignKey('defects',on_delete=models.SET_NULL)
 
    price = models.IntegerField(default=False)
    date_created = models.DateTimeField(auto_Now_add=True)
    total = models.IntegerField(blank=True,null=True)    

    def __str__(self):
        return self.user.username

解决方法

您必须重写CartSerializer中的创建方法,才能检查和更新(如果已创建)。我会提到一些与此相关的东西

覆盖创建方法

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = ['id','url','user','service','defects','date_created','quantity','price','total']

    def create(self,validated_data):
        """ Create cart if not created """
        cart,created = Cart.objects.get_or_create(**validated_data)
        if not created:
           cart.quantity=cart.quantity+1
        # you have to write your own logic i give you just an hint 
        return cart

在这里,我们覆盖了create方法,它在每次更改购物车对象的创建流程时在购物车URL上发布请求时都会调用

希望您能了解所有查询问题