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

相关文章
|
1月前
|
SQL 数据库 数据库管理
深入Django(七)
Django的数据库迁移系统是管理数据库模式变化的关键组件,自动化创建、修改和删除表及字段。它提供版本控制,便于团队协作。通过`makemigrations`生成迁移文件,`migrate`应用到数据库。迁移支持依赖关系和数据迁移功能,允许填充初始数据或执行数据转换。这个系统简化了数据库管理,促进了开发中的数据一致性。
28 5
|
1月前
|
Python
深入Django(五)
Django的URL路由系统将URL映射到视图。创建URLconf涉及编写视图、定义URL模式(如`home`和`about`)并在项目主`urls.py`中包含应用URL。动态URL模式允许捕获数据,如`post/<int:post_id>/`,并在视图中使用。命名URL便于模板和视图中引用,通过`{% url %}`模板标签或`reverse`函数。正则表达式用于更复杂URL模式匹配。URL路由是Django中组织请求与响应的核心机制。
30 4
|
1月前
|
前端开发 Python
深入Django(四)
**Django模板系统**简介:用于结合数据与HTML,生成网页内容。模板系统让动态数据能插入静态页面,模板语言支持Python代码嵌入。创建模板涉及在应用目录下建立`templates`文件夹及编写HTML。使用时,视图通过`render`函数加载模板,URL配置指向相应视图。模板语言包含控制结构(如if、for)、过滤器(如日期格式化、字符串截取)和自定义过滤器。模板继承则促进布局一致性,允许子模板扩展基础模板。模板系统简化了Django中的动态内容渲染。
11 3
|
1月前
|
数据库 Python
深入Django(八)
了解Django的管理后台,它是一个用于管理应用数据的内置Web界面。要启用它,需在`admin.py`中注册模型,创建超级用户,并访问服务器的`/admin/`路径。可自定义后台,如定义模型显示(通过`list_display`, `list_filter`, `search_fields`),定制表单界面(定义表单类和覆盖字段)以及进行高级定制,如字段选项和重写方法。管理后台支持添加、编辑和删除记录,以及批量操作。
23 2
|
1月前
|
Python
深入Django(三)
本文详细介绍了Django视图(Views)。视图是Django中处理用户请求并返回响应的函数或类,负责应用程序逻辑。文章通过实例展示了如何创建简单视图、使用类视图以及如何与模板配合动态生成HTML内容。此外,还提到了视图处理表单、权限认证和错误处理的功能。总之,Django视图是应用的核心组件,用于处理业务逻辑和用户交互。
10 2
|
1月前
|
前端开发 数据管理 API
深入Django(二)
本文介绍了Django的模型(Models)系统,它是Django框架中处理数据库的核心部分。模型是通过Python类定义的,对应数据库中的表,属性代表表的字段。通过模型,可以方便地操作数据,如创建、查询、更新和删除记录。文中展示了如何创建`Author`和`Post`模型,以及如何使用ORM进行对象操作。此外,还提到了模型的高级特性,如字段选项、字段类型、关系以及自定义方法和属性,这些都是Django高效管理数据的关键。理解模型对于Django应用开发至关重要。
22 1
|
6月前
|
缓存 安全 API
Django
Django是一个用Python编写的开源Web框架,用于构建可扩展、高性能、安全的Web应用程序。Django具有许多内置功能,如用户认证、管理界面、缓存、静态文件处理等,可以帮助开发者快速搭建和开发Web应用程序。 Django的用途主要包括:
71 1
|
10月前
|
Python
初识Django
初识Django
50 0
|
10月前
|
算法 前端开发 网络安全
【Django】Hello,DJango!
这样就在主目录下创建了一个自己的项目以下统称创建的项目路径为根目录(即ppeua_app/)
75 0
|
Python
Django 项目重命名
  在日常学习工作过程中,我们难免需要复用以前的项目,这里讲下复用 Django 项目并重命名的过程。 1.修改项目名称,使用 pycharm -> refactor 重命名整个项目。   2.修改 manage.py 和 Django 下和项目名称相同的文件夹,使用 grep 指令找出和项目有关的字符串,如: grep 'test4' *.py 逐一修改。
4532 0