django 4 序列化自定义field

from django import setup
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','diango1.settings') # 在环境变量中设置配置文件
setup() # 加载配置文件

class TEL(object):
    """电话号码对象"""
    def __init__(self, num=None):
        self.num = num
    def text(self, message):
        """发短信功能"""
        return self._send_message(message)
    def _send_message(self,message):
        """发短信"""
        print('Send {} to {}'.format(message[:10], self.num))
        
class TELField(serializers.Field):
   # 它决定在访问这个字段时的返回值应该如何展示,
 #obj 是 to_internal_value 返回的对象。 
 #作用如同描述符的__get__。
 #应该返回能够被序列化的数据结构。
 #如数字,字符串,布尔值 date/time/datetime 或者 None
    def to_representation(self, tel_obj):
        print("to_representation")
        return tel_obj.num
#它决定在对这个字段赋值时应该进行的操作,
#data 是前端传过来的字段值。作用如同描述符的__set__ 操作,
#应该返回一个 python 数据结构。在发生错误时,
#应抛出 serializers.ValidationError
    def to_internal_value(self, data):
        print("to_internal_value")
        data = data.lstrip().rstrip().strip()
        if 8 <= len(data) <=11:
            return TEL(num=data)
        raise serializers.ValidationError('Invalid telephone number.')


class ContactSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=20)
    tel = TELField()

frontend_data = {
    'name':'ucag',
    'tel':'88888888'
}
test = ContactSerializer(data=frontend_data)
if test.is_valid():
    tel = test.validated_data['tel']
    print('TEL',tel.num)
    tel.text('这是一个骚字段')

运行结果

to_internal_value  
TEL 88888888
Send 这是一个骚字段 to 88888888

未调用to_representation 即get方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容