加入到购物车的实现(利用serializer.serializer而不是modelserializer)前者更为基础,我们需要自己来写序列化方法
一、基本的serializer
from rest_framework import serializers
from goods.models import Goods
class ShoppingCartSerializer(serializers.Serializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault() # 表示user为隐藏字段,默认为获取当前登录用户
)
nums = serializers.IntegerField(required=True, min_value=1, label='商品数量', help_text='商品数量',
error_messages={
'min_value': '商品数量不能小于1',
'required': '请选择购买数量'
})
goods = serializers.PrimaryKeyRelatedField(queryset=Goods.objects.all(), required=True, label='商品')
二、views的实现
class ShoppingCartViewSet(viewsets.ModelViewSet):
"""
购物车功能实现
list:
获取购物车列表
create:
添加商品到购物车
update:
更新购物车商品数量
delete:
从购物车中删除商品
"""
# 权限问题:购物车和用户权限关联,这儿和用户操作差不多
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 用户必须登录才能访问
authentication_classes = (JWTAuthentication, SessionAuthentication) # 配置登录认证:支持JWT认证和DRF基本认证
serializer_class = ShoppingCartSerializer
queryset = ShoppingCart.objects.all()
三、配置url
#购物车url
router.register(r'shopcarts', ShoppingCartViewset, basename="shopcarts")
四、添加商品(重写create方法)
分为两种情况,当购物车数据库中没有这个商品时,执行添加;当已存在该商品时,执行数量更新。
class ShopCartSerializer(serializers.Serializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
nums = serializers.IntegerField(required=True, label="数量",min_value=1,
error_messages={
"min_value":"商品数量不能小于一",
"required": "请选择购买数量"
})
goods = serializers.PrimaryKeyRelatedField(required=True, queryset=Goods.objects.all())
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
五、指定queryset,只能显示当前登录用户的购物车列表
在ShoppingCartViewset中加入
def get_queryset(self):
return ShoppingCart.objects.filter(user=self.request.user)
六、修改购物车中商品数量(重写update方法)
class ShopCartSerializer(serializers.Serializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
nums = serializers.IntegerField(required=True, label="数量",min_value=1,
error_messages={
"min_value":"商品数量不能小于一",
"required": "请选择购买数量"
})
goods = serializers.PrimaryKeyRelatedField(required=True, queryset=Goods.objects.all())
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.nums = validated_data["nums"]
instance.save()
return instance