zoukankan      html  css  js  c++  java
  • python测试开发django-rest-framework-89.反序列化(ModelSerializer)之read_only和write_only

    前言

    ModelSerializer 反序列化的时候,设置 read_only=True 可以忽略传过来的字段,不写入到数据库。
    那么从数据库读出来的数据,序列化返回出来的时候,不显示某个字段,可以设置write_only=True

    设置 read_only=True

    接着前面这篇https://www.cnblogs.com/yoyoketang/p/14342631.html
    不想让用户创建的时候设置下架,于是可以忽略 goods_status(商品状态) 字段, 设置 read_only=True

    # 作者-上海悠悠 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)
        goods_stock = serializers.IntegerField(required=True)
    
        # 忽略字段,设置read_only=True
        goods_status = serializers.IntegerField(read_only=True)
    
        class Meta:
            model = Goods
            fields = '__all__'  # 返回全部的字段
    

    设置 write_only=True

    price是商品的成本价,用户在获取全部商品的时候,查询的时候不希望显示price,但是创建商品的时候,可以传price过去保存到数据库

    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,
                                           )
        goods_stock = serializers.IntegerField(required=True,
                                               min_value=1,
                                               max_value=10000)
        # 忽略字段,设置read_only=True
        goods_status = serializers.IntegerField(read_only=True)
        # 设置write_only=True
        price = serializers.FloatField(write_only=True)
    
        class Meta:
            model = Goods
            fields = '__all__'  # 返回全部的字段
    

    这时候查询的时候就不显示price

    但是创建商品的时候,price字段是可以被写入的

    查询数据库会看到已经写入到数据库了

    exclude 排除字段

    如果某个字段我们既不希望用户传到数据库,也不希望查询的时候显示给用户,那么可以用 exclude 排除字段的校验。

    如下排除 goods_groupid 商品分组字段的校验

    # 作者-上海悠悠 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,
                                           )
        goods_stock = serializers.IntegerField(required=True,
                                               min_value=1,
                                               max_value=10000)
        # 忽略字段,设置read_only=True
        goods_status = serializers.IntegerField(read_only=True)
        # 设置write_only=True
        price = serializers.FloatField(write_only=True)
    
        class Meta:
            model = Goods
            # fields = '__all__'  # 返回全部的字段
            # exclude是不包含某些字段
            exclude = ["goods_groupid"]
    

    提交数据的时候,带上goods_groupid参数,并不会写入到数据库,也不会被查询出来

    通过本篇的学习也就弄清楚了read_only=Truewrite_only=Trueexclude的区别了。

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14345717.html
Copyright © 2011-2022 走看看