最近项目比较忙,没有太多时间学习新的东西,这里记录一个在开发过程中使用的一个小知识。
在项目开发中有这么一个场景,用后端字属性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这个函数中实现就可以。
网友评论