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)