一、概述
在使用DRF的序列化器类,有些情况下需要对结果的中的某个字段进行进一步的处理时,可以不需要在视图类中,再次循环结果来处理,在序列化器类中就可以完成这部分的处理。
在序列化器类中完成对某些字段的进一步处理。
二、源码
方法名:to_representati
序列化器类:
from rest_framework import serializers
源码情况:通过下面的代码,将orm模型对象转成dict 数据类型的
def to_representation(self, instance):
"""
Object instance -> Dict of primitive datatypes.
"""
ret = OrderedDict()
fields = self._readable_fields
for field in fields:
try:
attribute = field.get_attribute(instance)
except SkipField:
continue
# We skip `to_representation` for `None` values so that fields do
# not have to explicitly deal with that case.
#
# For related fields with `use_pk_only_optimization` we need to
# resolve the pk value.
check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
if check_for_none is None:
ret[field.field_name] = None
else:
ret[field.field_name] = field.to_representation(attribute)
return ret
三、改造
数据模型:
class MessageModel(models.Model):
id = models.AutoField(primary_key=True)
status = models.CharField(max_length=10,default='未读',verbose_name='状态:已读、未读')
date = models.DateField(auto_now_add=True,verbose_name='消息创建日期',null=True)
datetime = models.DateTimeField(auto_now_add=True,verbose_name='信息创建时间')
content = models.JSONField(null=True,verbose_name='[‘标题:xx’,‘项目’:‘xx’,]')
operator = models.ForeignKey(to='user.UserModel',on_delete=models.SET_NULL,null=True)
1、需要对content字段进行改造:把标题和内容信息取出来,重新赋值到序列化好的字段中
2、获取operator对应的名字
3、格式化时间datetime
序列化器类写法:
class MessagesModelSerializer(ModelSerializer):
#1、时间格式化
datetime = serializers.DateTimeField(format='%Y-%m-%d %H:%M')
def to_representation(self, instance):
"""
对序列化结果,进行操作
"""
ret = super().to_representation(instance)
#2、信息创建者名字,可以在这里操作信息创建者的
if instance.operator:
ret['operator'] = instance.operator.name
#2、['标题:xxxx','内容:yyyy'] 取出标题和内容数据
for content_str in ret.get('content'):
if content_str[:3]=='内容:':
ret['content'] = content_str[3:]
if content_str[:3] == '标题:':
ret['title'] = content_str[3:]
return ret
class Meta:
model = models.MessageModel
fields = [
'id',
'content',
'datetime',
'status',
'operator'
]
四、应用场景
1、某些字段需要进一步的操作,但是序列化器类又没有现成的方法使用
2、原本模型类中没有下字段,想增加一个字段,并且该字段数据又是其他存在字段的操作后结果
3、像时间格式化,默认值,这些,就不用重写这个方法了。
一句话,就是要操作的字段逻辑相对复杂,无法直接实现时,使用。