zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    JAVA Aes加密解密
    15个实用的jQuery代码片
    mybatis-generator-config工具的使用
    Oracle中Merge into用法总结
    Highcharts 在低版本 IE 上使用注意事项及个人总结
    梦想是什么
    博客美化基本后台设置与样式设置
    IntelliJ Idea 常用快捷键列表
    磁盘
    [半转]1px边框 移动端
  • 原文地址:https://www.cnblogs.com/shijieli/p/10744910.html
Copyright © 2011-2022 走看看