博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DRF 商城项目 - 用户操作(收藏, 留言, 收货地址)
阅读量:6941 次
发布时间:2019-06-27

本文共 7525 字,大约阅读时间需要 25 分钟。

个人收藏 

整体逻辑类似于 个人中心 ( 个人中心的相关逻辑梳理详情   )

也是两个序列化组价的分流

查看收藏  ( 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 UniqueTogetherValidatorfrom goods.serializers import GoodsSerializer__author__ = "yangtuo"__date__ = "2019/4/18 20:31"from rest_framework import serializersfrom .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 UniqueTogetherValidatorfrom goods.serializers import GoodsSerializer__author__ = "yangtuo"__date__ = "2019/4/18 20:31"from rest_framework import serializersfrom .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

你可能感兴趣的文章
entity framework自动生成数据库外键“表名_外键”的解决方案
查看>>
JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
查看>>
ORA-12170: TNS:Connect timeout occurred
查看>>
二叉搜索树的插入与删除
查看>>
esd-ESD试题
查看>>
瘦客户端那些事 - 远程传输协议
查看>>
IT Configuration Management
查看>>
linux下git的安装和使用(转)
查看>>
浴血黑帮第三季/全集Peaky Blinders迅雷下载
查看>>
《深入浅出MFC》笔记(三)
查看>>
C语言程序中的内存结构数组
查看>>
Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)
查看>>
javascript -window与document 待整理
查看>>
[大数据之Sqoop] —— Sqoop初探
查看>>
JavaScript 图片上传预览效果
查看>>
Elasticsearch聚合初探——metric篇
查看>>
VS 2005的一个BUG及对其原因猜测
查看>>
HTTP协议的头信息详解
查看>>
I.MX6 Android Linux shell MMPF0100 i2c 设置数据
查看>>
网络复习之TCP
查看>>