django rest_framework 框架动态设置序列化返回的字段

news2024/12/23 23:32:22

动态修改字段可以使Django rest框架API像graphQL端点一样,只从模型中检索所需的字段。

一旦序列化器被初始化,就可以使用.fields属性访问序列化器上设置的字段字典。访问和修改此属性允许您动态修改序列化器。

显式地修改fields参数可以帮助您做一些奇怪的事情,例如在运行时修改序列化器字段参数,而不是预定义它。

在这里插入图片描述

  1. 创建项目
djang-admin startproject ellistest
  1. 创建app
cd ellistest
python manage.py startapp testserializer
  1. 注册app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'testserializer.apps.TestserializerConfig',
]

  1. 创建model以及序列化器 models.py
from django.db import models

# Create your models here.
class TestModel(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    
    def generateTwoValue(self):
        return self.name+'11',str(self.age)+'1'
    
    
from rest_framework import serializers
class TestModelSerializer(serializers.ModelSerializer):
    name_col = serializers.SerializerMethodField()
    age_col = serializers.SerializerMethodField()
    
    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        request = kwargs.get('context', {}).get('request')
        str_fields = request.GET.get('fields', '') if request else None
        fields = str_fields.split(',') if str_fields else None
        # Instantiate the superclass normally
        super(TestModelSerializer, self).__init__(*args, **kwargs)
        if fields is not None:
            # Drop any fields that are not specified in the `fields`
            # argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)
    class Meta:
        model = TestModel
        fields = '__all__'


    def _get_two_values(self, obj):
        if not hasattr(self, '_two_values'):
            self._two_values = obj.generateTwoValue()
        return self._two_values

    def get_name_col(self,obj):
        name_col, _ = self._get_two_values(obj)
        return name_col
    
    def get_age_col(self,obj):
        _, age_col = self._get_two_values(obj)
        return age_col

  1. 数据库迁移
python manage.py makemigrations
python manage.py migrate
  1. 创建view views.py
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from rest_framework import status
from testserializer.models import TestModel,TestModelSerializer
# Create your views here.
class TestView(GenericViewSet):
    queryset = TestModel.objects.all()
    serializer_class = TestModelSerializer
    
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
  1. 创建路由 urls.py

from django.conf.urls import url, include
from rest_framework import routers
from testserializer.views import TestView

route = routers.DefaultRouter(trailing_slash=False)
route.register(r'test',TestView,'test')

urlpatterns = [
    url(r'^',include(route.urls)),
]

访问:
http://127.0.0.1:9999/api/v1/test?fields=name,age

https://stackoverflow.com/questions/40663579/call-method-once-to-set-multiple-fields-in-django-rest-framework-serializer

https://joel-hanson.medium.com/advanced-serializer-usage-dynamically-modifying-fields-e7c3bc28efa6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/772526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解码 LangChain|用 LangChain 和 Milvus 从零搭建 LLM 应用

如何从零搭建一个 LLM 应用?不妨试试 LangChain Milvus 的组合拳。 作为开发 LLM 应用的框架,LangChain 内部不仅包含诸多模块,而且支持外部集成;Milvus 同样可以支持诸多 LLM 集成,二者结合除了可以轻松搭建一个 LLM…

猿辅导推出颠覆性产品小猿学练机,加速个性化学习时代到来

近期,沉默近两年的猿辅导在智能硬件领域释放动作,发布旗下首款智能硬件产品——小猿学练机。这一动作代表着,猿辅导正式入局1000亿智能硬件市场。据了解,小猿学练机面向全国中小学生,主打学练一体、以练促学&#xff0…

外部邻区TAC配置错误导致语音被叫无响应问题分析

1、问题描述 用户131********用户(中兴AXON 40终端)容易出现被叫无响应的现象,现场测试发生概率大约10%。 2、信令分析 6月4日现场测试时,11.47分左右,131********测试时出现一起未接通问题。 端到端平台信令回溯分析…

ubuntu - Linux 下的常用命令

ls 查看当前文件夹下的内容 pwd 查看当前所在文件夹 cd 切换文件夹 touch 如果文件不存在,创建文件 mkdir 创建新目录 rm 删除指定的文件 clear 清屏 ctrl shift 放大终端窗口的字体显示 ctrl - 缩小终端窗口的字体显示 按 上/下 光标键可以在…

【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)

目录 💥1 概述 1.1 电价伸缩系数分析 1.2 需求侧响应数学模型 1.3 粒子群算法求解 1.4 本文流程图 📚2 运行结果 2.1 风电和光伏的出力情况 2.2 峰谷时段分类 2.3 分时电价制定及负荷响应结果 2.3.1 仅考虑需求响应 2.3.2 考虑分布式和需…

图论 并查集 模拟 位运算—题841、127、684、685、657、31、463、1356 C++实现与有向图 无向图 并查集总结

文章目录 841.钥匙和房间DFSBFS 127. 单词接龙684.冗余连接685.冗余连接II657. 机器人能否返回原点31.下一个排列463. 岛屿的周长解法1解法2 1356. 根据数字二进制下 1 的数目排序解法1解法2 注意点 图论:题841、127 并查集:题684、685 模拟:…

记一次从溯源分析到云服务器接管

起因是我这个臭运维的在给客户做常态化的溯源分析,好巧不巧发现了一个IP扔到奇安信威胁情报平台看一下,发现部署了大量的服务,且为阿里云服务器。 看到这里,我大胆的推测,云上的信息中心,客户花点钱&#x…

《教育界》期刊简介及投稿邮箱

《教育界》期刊简介及投稿邮箱 一、《教育界》期刊简介 《教育界》是面向各级教育行政主管部门、教育科研院所、各类大中专院校、中小学校及其从事教育教学工作的教育工作者和专业教师的综合性教育教学类素质教育专业性教育学术理论期刊。 主管单位:广西师范大学…

create database创建数据库失败

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5.7 症状 1、执行如下sql语句创建数据库报错。 create database printcdburn with encodingUTF8 OWNERprintcdburn LC_COLLATEzh_CN.UTF-…

蓝桥杯真题:密码脱落(区间dp)

目录 题目: 解题思路: dp分析: 解题代码: 题目: 解题思路: 题目要求的为脱落的种子数(即回文字符中没有对应回文的字符的数量) 我们可以转换成求回文字符串最长回文字符串的长…

Unity基础 固定关节 FixedJoint

Unity是一款强大的游戏开发引擎,它提供了各种丰富的功能和组件,使开发者能够轻松创建复杂的游戏世界。其中,固定关节(FixedJoint)是Unity中一个非常重要的组件,它用于实现物体之间的固定连接。 组件主要面板…

简述直线导轨的预压力

直线导轨的预压力是预先给予钢珠负荷力,通俗来说就是加大钢珠直径,利用钢珠和珠道之间负向间隙给予预压,这个举动可以提高直线滑轨的刚性和消除间隙,值得注意的一点是小规格建议选用轻预压以下的预压,避免因为预压选用…

fastDFS 6.0.9 单机安装案例

文章目录 fastDFS 6.0.9单机安装案例(1)前置环境安装明细(2)依赖库安装(3)libfatscommon安装(4)libserverframe 安装(5)FastDFS 安装默认命令工具查看 &#…

如何快速入门C#编程?

学习C#需要持续努力和实践,但是在一周内入门是有可能的,前提是你愿意付出足够的时间和精力。以下是一周内入门C#的步骤和建议: 设定学习目标: 在一周内学习C#需要专注于基础知识。明确你的学习目标,例如了解语法、变量…

使用STM32 在实现温湿度LCD显示并蓝牙透传

项目需求 通过温湿度传感器将值传到LCD1602,并实时通过蓝牙透传到手机。 硬件介绍 LCD1602 是一种工业字符型液晶,能够同时显示16x02即32字符 (16列两行) DHT11 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复…

云计算名词-IaaS,PaaS,SaaS

在学习分布式的过程中,知道了PaaS这个词儿,但是不知道是什么意思。从网上查询了之后,做了简单的了解。这里简单记录一下,方面之后的查阅。 IAAS(Infrastructure-as-a-Service)基础设施即服务 网上的定义是…

hdfs的读写流程

hdfs的写入流程 1.client发起文件上传请求,通过rpc与namenode建立通讯,namenode检查目标文件是否已经存在,父目录是否存在,返回是否可以上传 2.client请求第一个block该传输到哪些datanode服务器上 3.namenode根据配置文件中指定…

支付宝支付上线准备工作(商家自研接入)

商家自研流程 1.创建应用 登录支付宝开放平台创建 网页/移动应用 说明:生成的应用唯一标识 APPID 可用于调用开放产品接口。 2.配置应用 2.1 应用详情 2.2 产品绑定 2.3 开发设置 在开发 > 开发设置 中配置应用信息。 2.3.1 接口加密方式 按操作步骤进行…

Mysql——》InnoDB行格式

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

微服务保护---挑战(雪崩问题/流量控制/隔离和降级)

目录 1.雪崩问题 1.1.解决雪崩问题的常见方式有四种 2.什么是Sentinel 2.1.安装Sentinel控制台 2.2.微服务整合Sentinel 3.流量控制 3.1.簇点链路 3.2.快速入门 3.2.1.示例 3.2.2.利用jmeter测试 3.3.流控模式 3.3.1.关联模式 3.3.2.链路模式 3.3.3.总结 3.4.流控…