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

  • 文章
  • 作者:Hubery
  • 发布时间:2019-06-26
  • 阅读数:3262
  • 分类:django-rest-framework
  • 标签: Django DRF

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

    在项目开发中有这么一个场景,用后端字属性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这个函数中实现就可以。


评论列表
优秀的你不评论一下咩!!
新的评论