首页 > 名博 > 正文

SerializerMethodField 字段实现自定义序列化显示内容

最近项目比较忙,没有太多时间学习新的东西,这里记录一个在开发过程中使用的一个小知识。

在项目开发中有这么一个场景,用后端字属性choices选择保存的内容(这样可以节省空间),在前端显示保存值对应内容时,之前django开发前后端不分离时可以直接在前端使用 obj.get_<fied_name>_display 获取,但现在开发的项目前后端分离,序列化时无法直接显示值对应的内容。

经过查询DRF的文档,发现了这个SerializerMethodField属性,详情介绍点击查看,他可以配置一个只读字段。它通过调用附加到的序列化程序类上的方法来获取其值。它可用于将任何类型的数据添加到对象的序列化表示中。

下面是示例代码

method_name要调用序列化程序上方法的名,如果没有,则默认找到get_method_name需要接受两个参数,一个self,一个序列化对象

fromdjango.contrib.auth.modelsimportUser

fromdjango.utils.timezoneimportnow

fromrest_frameworkimportserializers

classUserSerializer(serializers.ModelSerializer):

days_since_joined=serializers.SerializerMethodField()

classMeta:

model=User

defget_days_since_joined(self,obj):

return(now()-obj.date_joined).days

#还可以用在choice字段显示对应的值

#model.py

classTest(model.Model):

TYPE=(

(0,'个人'),

(1,'单中心'),

(2,'多中心')

)

name=models.CharField('项目名称',max_length=50,null=True)

type=models.SmallIntegerField('随访类型',choices=TYPE,default=0)

#serializers.py

classTestSerializer(serializers.ModelSerializer)

type=serializers.SerializerMethodField()

classMeta:

model=Test

field='__all__'

defget_type_value(selg,obj)

returnobj.get_type_display())#django获取choice对应值的方法 我这里主要用于获取一下choice中对应的值,其实可以利用这个属性实现很多效果,只需要在method_name这个函数中实现就可以。


网友评论

验证码 换一张
取 消
暂无评论...
为您推荐
  • 相关阅读
  • 业界资讯
  • 手机通讯
  • 电脑办公
  • 新奇数码
  • 软件游戏
  • 科学探索