DRF 商城项目 - 用户操作(收藏, 留言, 收货地址)
个人收藏
整体逻辑类似于 个人中心 ( 个人中心的相关逻辑梳理详情 点击这里 )
也是两个序列化组价的分流
查看收藏 ( list ) 详情指向 收藏详情 的组价
创建收藏 ( create ) 指向 用户收藏 的组件
序列化组件
收藏详情需要用到收藏的商品全部内容, 序列化的时候需要进行组件的嵌套, 将商品序列化组件嵌进去
# 收藏详情 class UserFavDetailSerializer(serializers.ModelSerializer): goods = GoodsSerializer(many=True) class Meta: model = UserFav fields = ("goods", "id")
收藏的时候需要注意设置一个联合唯一索引, 在序列化中设置后或者 models 中设置皆可
# 用户收藏 class UserFavSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) class Meta: model = UserFav # 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证 # 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理 validators = [ UniqueTogetherValidator( queryset=UserFav.objects.all(), fields=('user', 'goods'), message="已经收藏过了" ) ] fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作
视图
整体逻辑类似于个人中心
依旧是 分流处理序列化组件, 因为收藏功能的全部请求都需要在用户登录下查看
因此不需认证分流
# 用户收藏功能 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ list: 获取用户收藏列表 retrieve: 判断某个商品是否已经收藏 create: 收藏商品 destroy: 取消商品收藏 """ # queryset = UserFav.objects.all() # 只能看自己的收藏记录 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) serializer_class = UserFavSerializer authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) lookup_field = "goods_id" # 分流处理 序列化组件 def get_serializer_class(self): if self.action == "list": return UserFavDetailSerializer elif self.action == "create": return UserFavSerializer return UserFavSerializer def get_queryset(self): return UserFav.objects.filter(user=self.request.user)
用户留言
基本上所用的字段什么的在上面都有用过了
序列化组件
需要注意的是留言时间的格式, 以及只读属性
注意 user 字段的传入应该是默认的当前用户, 且此字段可以设置成隐藏
# 用户留言 class LeavingMessageSerializer(serializers.ModelSerializer): # 设置隐藏字段 user = serializers.HiddenField( # 默认值为当前用户 default=serializers.CurrentUserDefault() ) # 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读 add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserLeavingMessage fields = ("user", "message_type", "subject", "message", "file", "id", "add_time")
视图
# 用户留言 class LeavingMessageViewset(mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): """ list: 获取用户留言 create: 添加留言 delete: 删除留言功能 """ permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) serializer_class = LeavingMessageSerializer def get_queryset(self): return UserLeavingMessage.objects.filter(user=self.request.user)
用户收货地址
基本上和留言一样了.
序列化组件
# 收货地址 class AddressSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserAddress fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")
视图
# 收货地址 class AddressViewset(viewsets.ModelViewSet): """ 收货地址管理 list: 获取收货地址 create: 添加收货地址 update: 更新收货地址 delete: 删除收货地址 """ permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) serializer_class = AddressSerializer def get_queryset(self): return UserAddress.objects.filter(user=self.request.user)
全部代码
替换视图序列化
# _*_ coding:utf-8 _*_ from rest_framework.validators import UniqueTogetherValidator from goods.serializers import GoodsSerializer __author__ = "yangtuo" __date__ = "2019/4/18 20:31" from rest_framework import serializers from .models import UserFav, UserLeavingMessage, UserAddress # 收藏详情 class UserFavDetailSerializer(serializers.ModelSerializer): goods = GoodsSerializer() class Meta: model = UserFav fields = ("goods", "id") # 用户收藏 class UserFavSerializer(serializers.ModelSerializer): # 用户就使用当前的默认用户, 并且设置为隐藏 user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) class Meta: model = UserFav # 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证 # 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理 validators = [ UniqueTogetherValidator( queryset=UserFav.objects.all(), fields=('user', 'goods'), message="已经收藏过了" ) ] fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作 # 用户留言 class LeavingMessageSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) # 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读 add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserLeavingMessage fields = ("user", "message_type", "subject", "message", "file", "id", "add_time") # 收货地址 class AddressSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserAddress fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")
用户操作视图
# _*_ coding:utf-8 _*_ from rest_framework.validators import UniqueTogetherValidator from goods.serializers import GoodsSerializer __author__ = "yangtuo" __date__ = "2019/4/18 20:31" from rest_framework import serializers from .models import UserFav, UserLeavingMessage, UserAddress # 收藏详情 class UserFavDetailSerializer(serializers.ModelSerializer): goods = GoodsSerializer() class Meta: model = UserFav fields = ("goods", "id") # 用户收藏 class UserFavSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) class Meta: model = UserFav # 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证 # 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理 validators = [ UniqueTogetherValidator( queryset=UserFav.objects.all(), fields=('user', 'goods'), message="已经收藏过了" ) ] fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作 # 用户留言 class LeavingMessageSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) # 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读 add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserLeavingMessage fields = ("user", "message_type", "subject", "message", "file", "id", "add_time") # 收货地址 class AddressSerializer(serializers.ModelSerializer): user = serializers.HiddenField( default=serializers.CurrentUserDefault() ) add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta: model = UserAddress fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")
本文来自博客园,作者:羊驼之歌,转载请注明原文链接:https://www.cnblogs.com/shijieli/p/10744910.html