drf完成购物车相关功能

serializer:
因为添加购物和查询购物车的字段有些不同所以使用了两个serializer

# 购物车列表
class ShoppingDetailSerializer(serializers.ModelSerializer):
    goods=GoodsSerializer(many=False)
    class Meta:
        model=ShoppingCart
        fields="__all__"

#增加修改购物车
class ShoppingCrateSerializer(serializers.Serializer):
	# 选择商品的时候会去将所有的商品给查出来
    goods=serializers.PrimaryKeyRelatedField(required=True,queryset=Goods.objects.all(),label="商品名")
    nums=serializers.IntegerField(required=True,max_value=99,label="商品数量",min_value=1,)
    # 获取当前登陆的用户
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    def create(self, validated_data):
        # 获取当前用户
        user=self.context["request"].user
        goods=validated_data["goods"]
        nums=validated_data["nums"]
		# 判断用户是再次添加购物车已有的商品还是添加新的商品
        existed=ShoppingCart.objects.filter(user=user,goods=goods)
        if existed:
            existed=existed[0]
            existed.nums+=nums
            existed.save()
        else:
            existed=ShoppingCart.objects.create(**validated_data)
        return existed
	# 修改商品,只让修改数量
    def update(self, instance, validated_data):
        instance.nums=validated_data["nums"]
        instance.save()
        return instance
    class Meta:
        model = ShoppingCart
        fields = ["user", "goods", "nums"]

view:

class ShoppingCrateViewSet(viewsets.ModelViewSet):
    """
    购物车
    create : 加入购物车
    list: 购物车列表
    destroy: 删除购物车
    update: 修改购物车数量
    
    """

    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)

    queryset = ShoppingCart.objects.all()

    serializer_class = ShoppingCrateSerializer
    # 查询购物车和增加的购物的serializer不一样使用动态设置serializer
    def get_serializer_class(self):
        if self.action=="list":
            return ShoppingDetailSerializer
        else:
            return ShoppingCrateSerializer



    # 重写queryset方法,因为只需要获取当前用户的购物车
    def get_queryset(self):
        return ShoppingCart.objects.filter(user=self.request.user)

猜你喜欢

转载自blog.csdn.net/qq_48082548/article/details/126507249
今日推荐