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

相关文章
|
6月前
|
关系型数据库 MySQL 数据库
django初学
【7月更文挑战第3天】1. 安装Django: `pip install Django` 2. 创建项目: `django-admin startproject HelloWorld` 3. 启动项目: `python manage.py runserver 0.0.0.0:8000` 4. 生成应用: `django-admin startapp TestModel` 5. 配置多数据库(MySQL):
45 1
|
8月前
|
SQL 数据库 数据库管理
深入Django(七)
Django的数据库迁移系统是管理数据库模式变化的关键组件,自动化创建、修改和删除表及字段。它提供版本控制,便于团队协作。通过`makemigrations`生成迁移文件,`migrate`应用到数据库。迁移支持依赖关系和数据迁移功能,允许填充初始数据或执行数据转换。这个系统简化了数据库管理,促进了开发中的数据一致性。
60 5
|
8月前
|
前端开发 Python
深入Django(四)
**Django模板系统**简介:用于结合数据与HTML,生成网页内容。模板系统让动态数据能插入静态页面,模板语言支持Python代码嵌入。创建模板涉及在应用目录下建立`templates`文件夹及编写HTML。使用时,视图通过`render`函数加载模板,URL配置指向相应视图。模板语言包含控制结构(如if、for)、过滤器(如日期格式化、字符串截取)和自定义过滤器。模板继承则促进布局一致性,允许子模板扩展基础模板。模板系统简化了Django中的动态内容渲染。
34 3
|
8月前
|
Python
深入Django(三)
本文详细介绍了Django视图(Views)。视图是Django中处理用户请求并返回响应的函数或类,负责应用程序逻辑。文章通过实例展示了如何创建简单视图、使用类视图以及如何与模板配合动态生成HTML内容。此外,还提到了视图处理表单、权限认证和错误处理的功能。总之,Django视图是应用的核心组件,用于处理业务逻辑和用户交互。
36 2
|
8月前
|
数据库 Python
深入Django(八)
了解Django的管理后台,它是一个用于管理应用数据的内置Web界面。要启用它,需在`admin.py`中注册模型,创建超级用户,并访问服务器的`/admin/`路径。可自定义后台,如定义模型显示(通过`list_display`, `list_filter`, `search_fields`),定制表单界面(定义表单类和覆盖字段)以及进行高级定制,如字段选项和重写方法。管理后台支持添加、编辑和删除记录,以及批量操作。
49 2
|
8月前
|
前端开发 数据管理 API
深入Django(二)
本文介绍了Django的模型(Models)系统,它是Django框架中处理数据库的核心部分。模型是通过Python类定义的,对应数据库中的表,属性代表表的字段。通过模型,可以方便地操作数据,如创建、查询、更新和删除记录。文中展示了如何创建`Author`和`Post`模型,以及如何使用ORM进行对象操作。此外,还提到了模型的高级特性,如字段选项、字段类型、关系以及自定义方法和属性,这些都是Django高效管理数据的关键。理解模型对于Django应用开发至关重要。
44 1
|
Python
初识Django
初识Django
71 0
|
数据库 数据安全/隐私保护 Python
|
算法 前端开发 程序员
初识Django(一)
什么Django        Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
1605 0