SerializerMethodField 字段实现自定义序列化显示内容
最近项目比较忙,没有太多时间学习新的东西,这里记录一个在开发过程中使用的一个小知识。
在项目开发中有这么一个场景,用后端字属性choices选择保存的内容(这样可以节省空间),在前端显示保存值对应内容时,之前django开发前后端不分离时可以直接在前端使用 obj.get_<fied_name>_display 获取,但现在开发的项目前后端分离,序列化时无法直接显示值对应的内容。
经过查询DRF的文档,发现了这个SerializerMethodField 属性,详情介绍点击查看,他可以配置一个只读字段。它通过调用附加到的序列化程序类上的方法来获取其值。它可用于将任何类型的数据添加到对象的序列化表示中。
下面是示例代码
method_name 要调用序列化程序上方法的名,如果没有,则默认找到get_method_name 需要接受两个参数,一个self,一个序列化对象
from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
days_since_joined = serializers.SerializerMethodField()
class Meta:
model = User
def get_days_since_joined(self, obj):
return (now() - obj.date_joined).days
# 还可以用在choice字段 显示对应的值
# model.py
class Test(model.Model):
TYPE = (
(0, '个人'),
(1, '单中心'),
(2, '多中心')
)
name = models.CharField('项目名称', max_length=50, null=True)
type = models.SmallIntegerField('随访类型', choices=TYPE, default=0)
# serializers.py
class TestSerializer(serializers.ModelSerializer)
type = serializers.SerializerMethodField()
class Meta:
model = Test
field='__all__'
def get_type_value(selg, obj)
return obj.get_type_display()) # django 获取choice对应值的方法
我这里主要用于获取一下choice中对应的值,其实可以利用这个属性实现很多效果,只需要在method_name这个函数中实现就可以。