美文网首页
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