购物车 就有 获取购物车详情 加入购物车 删除购物记录
同样 直接使用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