Django-SerializerMethodField-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Django-SerializerMethodField

简介: DRF-Serializer-SerializerMethodField,更加灵活的修改返回给前端的数据

目标

  • 有一个status状态,后端存的是0、1,前端需要展示为否、是
  • 后段返回给前端时,直接返回否、是,前端读取展示,不需要判断。

实现方法1,加字段

  • 加一个只读字段status_zh,根据status判断赋值后返回给前端,前端使用status_zh
  • 例:

    # models.py
    ######
    from django.db.models import Model, BooleanField
    
    class TestModel(Model):
        status = BooleanField(default=False, name='status')
      
        @property
        def status_zh(self):
            status_ = "是" if self.status else "否" 
            return status_
    ######
    
    # seriailzer.py
    ######
    from models import TestModel
    from rest_framework import serializers
    from rest_framework.serializers import SerializerMethodField, BooleanField
    class TestSerializer(serializers.ModelSerializer):
        status_zh = BooleanField(read_only=True)
      
        class Meta:
            model = TestModel
            fields = ("id", "status_zh", "status")

实现方法2,使用SerializerMethodField

  • 使用SerializerMethodField修改status的值
  • 例:

    # models.py
    ######
    from django.db.models import Model, BooleanField
    
    class TestModel(Model):
        status = BooleanField(default=False, name='status')
    
    ######
    
    # seriailzer.py
    ######
    from models import TestModel
    from rest_framework import serializers
    from rest_framework.serializers import SerializerMethodField
    class TestSerializer(serializers.ModelSerializer):
        status = SerializerMethodField()
      
        class Meta:
            model = TestModel
            fields = ("id", "status")
      
        def get_status(selef, obj):
            return "是" if obj.status else "否" 
  • 使用这个方法虽然简化了一部分的代码,但是也有隐患,status变成了一个read_only的值,无法进行修改,所以使用的时候需要考虑实际情况。

SerializerMethodField文档解释

这是一个只读字段。它通过调用附加到的序列化程序类上的方法来获取其值。它可用于将任何类型的数据添加到对象的序列化表示中。
签名:SerializerMethodField(method_name=None)
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

参考链接:时光不写博客-Django-SerializerMethodField

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章