美文网首页
Django rest framework 之 DictFiel

Django rest framework 之 DictFiel

作者: 河码匠 | 来源:发表于2021-07-22 15:38 被阅读0次

    1. ListField

    当需要接收一个 list 的时候使用。

    参数:
    child - 应该用于验证列表中对象的字段实例。如果未提供此参数,则将不验证列表中的对象。
    min_length - 验证列表中包含的元素不少于此数量。
    max_length - 验证列表中所包含的元素数量不超过此数量。

    # 传入的list 中必需是 int 类型
    serializers.ListField(child=serializers.IntegerField())
    

    2. DictField

    当传入的数据是 dict 时使用。

    参数:
    child - 应该用于验证字典中值的字段实例。如果未提供此参数,则将不验证映射中的值。
    allow_empty - 指定是否允许空字典。

    # 注意,当设置 child 后 dict 只能是一维
    serializers.DictField(child=serializers.IntegerField())
    

    3. 自定义字段类型

    自定一的字段类可以继承 serializers.Field 标准字段类。也可以继承已存在的类进行重构

    from rest_framework import serializers
    
    
    class CustomField(serializers.Field):
    
         # 这个方法可以操作数据库存储的数据,进行自定义序列化
         def to_representation(self, value):
            pass
    
          # 对出入的数据进行操作
         def to_internal_value(self, data):
            pass
    

    4. 当传入数据是 dict 存入数据库是 yaml 时

    当传入的数据是 dict ,存入数据库的数据是 yaml 时,使用默认 DictField 在返回数据时会报错。根据报错信息翻看源码发现在调用 to_representation 时,因为 DictFieldto_representation 是处理 dict 数据的,所以会报错。

    源码

        def to_representation(self, value):
            # 这里 value 的数据会是 yaml 格式的字符串 value.items() 时报错 
            # 因为这里是处理 dict 数据时使用的
            return {
                str(key): self.child.to_representation(val) if val is not None else None
                for key, val in value.items()
            }
    

    解决办法重写 DictFieldto_representation 方法

    class StratagyField(serializers.DictField):
        def to_representation(self, value):
            return yaml.load(value, Loader=yaml.FullLoader)
    

    相关文章

      网友评论

          本文标题:Django rest framework 之 DictFiel

          本文链接:https://www.haomeiwen.com/subject/esaemltx.html