在使用drf的序列化器时,可能需要在序列化结果上进行进一步操作,但又不想多做一次循环操作时,可以通过操作序列化器类中的 to_representation方法来控制:
模型类:
from django.db import models
# Create your models here.
SOURCE = (('web','web端'),('app','移动端'),('applet','联系人'))
VISIT_TYPE = (('visit','来访'),('leave','离院'))
class VisitModel(models.Model):
id = models.AutoField(primary_key=True)
number = models.CharField(max_length=64,verbose_name='编号')
visit_type = models.CharField(max_length=16,choices=VISIT_TYPE,verbose_name='来访/离院')
name = models.CharField(max_length=128,verbose_name='联系人的名字')
sex = models.CharField(max_length=16,verbose_name='联系人的性别')
source = models.CharField(max_length=32,choices=SOURCE,verbose_name='创建记录来源')
1、对于choices类型,前端展示的时候,只想展示中文字符串:
from . import models
VISIT_TYPE_DICT = {k:v for k,v in models.VISIT_TYPE} #访问类型
SOURCE_DICT = {k:v for k, v in models.SOURCE} #记录信息来源
#1、来访登记的获取和增加
class ContactVisitPatientModelSerializer(ModelSerializer):
create_time = serializers.DateTimeField(format=DATETIME_FORMAT,read_only=True)
def to_representation(self, instance):
'''
序列化时,通过这个方法将模型对象转成字典数据结构的
:param instance: 模型对象,如果实例化序列化器时传递的是queryset,这个方法会被调用多次
1、instance是模型对象,
2、也就是可以通过instance去调用模型中创建的所有方法了
:return:
'''
representation = super().to_representation(instance)
#修改choices 获取的值,设置成对应的中文
representation['visit_type'] = VISIT_TYPE_DICT.get(representation['visit_type'])
representation['source'] = SOURCE_DICT.get(representation.pop('source'))
#可以随意的添加返回值,即使该字段在数据库中不存在
return representation
class Meta:
model = models.VisitModel
fields = [
'id','number','visit_type','name','sex','source',
]
2、对于想给序列化后的字典,新增一个默认的数据,也可以在这里进行操作的。