• python测试开发django-rest-framework-94.序列化(ModelSerializer)之嵌套对象


    前言

    前面一篇在查询我的收藏的时候,只显示了商品的id和收藏状态,并没有显示商品的详情。如果我们想查询的结果显示商品的详情,需关联到商品表。

    嵌套对象

    我们在查询的时候,希望能显示商品的详情

    于是可以在序列化的时候嵌套

    from .models import Goods, UserCollect
    from rest_framework import validators
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    class GoodsSerializer(serializers.ModelSerializer):
        """序列化商品models"""
        create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        
        # 必传字段
        goods_code = serializers.CharField(required=True,
                                           max_length=15,
                                           min_length=8,
                                           validators=[validators.UniqueValidator(queryset=Goods.objects.all(),
                                                                                  message="goods_code 已存在")]
                                           )
    
    
        class Meta:
            model = Goods
            fields = '__all__'  # 返回全部的字段
    
    
    class UserCollectSerializer(serializers.ModelSerializer):
        # 获取当前登录的用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        status = serializers.ChoiceField(choices=(
                                                    (0, '取消收藏'),
                                                    (1, '已收藏')
                                                   ),
                                         read_only=True)
        create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        # 嵌套商品序列化
        goods = GoodsSerializer()
    
        def to_representation(self, instance):
            """to_representation自定义序列化数据的返回"""
            data = super().to_representation(instance)
            data.update(status=instance.get_status_display())
            return data
    
        class Meta:
            # validate实现唯一联合,一个商品只能收藏一次
            validators = [
                validators.UniqueTogetherValidator(
                    queryset=UserCollect.objects.all(),
                    fields=('user', 'goods'),
                    # message的信息可以自定义
                    message="已收藏"
                )
            ]
            model = UserCollect
            # 收藏的时候需要返回商品的id,因为取消收藏的时候必须知道商品的id是多少
            fields = '__all__'  # 返回全部的字段
    
    

    此时查询全部,可以显示关联的商品详情

    虽然查询没问题,但是在收藏提交商品id的时候,会要求提交dict数据,这不是我们期望的

    自定义查询字段

    我们希望在收藏的时候,还是提交商品的id,查询的时候能显示详情,于是可以优化下,自定义查询用到get_<字段名称>

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    class UserCollectSerializer(serializers.ModelSerializer):
        # 获取当前登录的用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        status = serializers.ChoiceField(choices=(
                                                    (0, '取消收藏'),
                                                    (1, '已收藏')
                                                   ),
                                         read_only=True)
        create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
        # 添加个goods_detail
        goods_detail = serializers.SerializerMethodField()
        
        def get_goods_detail(self, obj):
            """查询商品表详情"""
            return GoodsSerializer(instance=obj.goods).data
    
        def to_representation(self, instance):
            """to_representation自定义序列化数据的返回"""
            data = super().to_representation(instance)
            data.update(status=instance.get_status_display())
            return data
    
        class Meta:
            # validate实现唯一联合,一个商品只能收藏一次
            validators = [
                validators.UniqueTogetherValidator(
                    queryset=UserCollect.objects.all(),
                    fields=('user', 'goods'),
                    # message的信息可以自定义
                    message="已收藏"
                )
            ]
            model = UserCollect
            # 收藏的时候需要返回商品的id,因为取消收藏的时候必须知道商品的id是多少
            fields = '__all__'  # 返回全部的字段
    

    收藏的时候根据商品id收藏

    查询的时候返回详情

  • 相关阅读:
    为什么RedLock并不能100%解决Redis做分布式锁的问题?
    阿里巴巴sentinel熔断降级(请求方是浏览器、请求方是应用两种方式考虑)
    阿里巴巴sentinel里面熔断里面RT是什么意思?(是什么单词的缩写)
    人生而孤独,却渴望陪伴。
    教你从官网下载commons-logging jar包(授人鱼不如授人以渔)
    spring5学习笔记-demo1
    企业网络规划
    scapy 查找自己的网卡(默认网卡)
    前端开发中常用的几种设计模式
    webpack打包原理
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14353427.html
Copyright © 2020-2023  润新知