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方法