django-restful:购物车 学习记录

发布时间 2023-04-22 11:38:30作者: 布衣梦蝶1978

购物车 就有 获取购物车详情 加入购物车 删除购物记录 同样 直接使用mixins 中的 就够了

view 这里面没有一个陌生的 基本都是前面学习过了的

class ShoppingCartViewset(viewsets.ModelViewSet):
    """
    购物车功能
    list:
        获取购物车详情
    create:
        加入购物车
    delete:
        删除购物记录
    """
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    # serializer_class = ShopCartSerializer
    lookup_field = 'goods_id'

    def get_queryset(self):
        # 获取属于用户的购物车list
        return ShoppingCart.objects.filter(user=self.request.user)

    def get_serializer_class(self):
        if self.action == 'list':
            return ShopCartDetailSerializer
        else:
            return ShopCartSerializer

serializer

#购物车详情
class ShopCartDetailSerializer(serializers.ModelSerializer):
    goods = GoodsSerializer(many=False,read_only=True)  
    #购物车详情中 一个商品只能有一个 
    #如果用户对一个商品多次购买  就进行数量累加 
    #而下面这个 serializer 就不用  可以多样显示
    class Meta:
        model = ShoppingCart
        fields = "__all__"

#购物车
class ShopCartSerializer(serializers.Serializer):  # 为什么不使用modelserializer 可以去看model中的解释
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    goods = serializers.PrimaryKeyRelatedField(queryset=Goods.objects.all(), required=True)
    nums = serializers.IntegerField(label="数量", required=True, min_value=1, error_messages={
        'min_value': "商品数量不能小于一",
        "required": "请选择购买数量",
    })
  #这里就是重写create方法 因为 本身的serializer验证不能通过
    def create(self, validated_data):
        user = self.context['request'].user  # 上下文
        nums = validated_data['nums']
        goods = validated_data['goods']

        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 是model 的实例
        instance.nums = validated_data['nums']
        instance.save()
        return instance