django ModelSerializer自定义显示字段

文章目录

  • 前言
  • 一、问题
  • 二、解决


前言

最近在复习django的时候,发现了一个有趣的问题,解决了之后特意记录下来,以供以后参考。

一、问题

相信大家使用django的时候,被其DRF的强大功能所折服,因为它能通过简单的代码就能帮助我们实现增删改查等最简单的操作。我的demo代码如下:
模型类代码,models.py

from django.db import modelsclass StudentInfo(models.Model):name = models.CharField(max_length=10, verbose_name='姓名')sex = models.CharField(max_length=1, verbose_name='性别')from_class = models.ForeignKey(ClassInfo, on_delete=models.CASCADE)

序列化器代码,serializers.py

from rest_framework import serializers
from demo import modelsclass StudentInfoSerializer(serializers.ModelSerializer):class Meta:model = models.StudentInfofields ="__all__"

视图代码,views.py

from rest_framework.viewsets import ModelViewSet
from .models import StudentInfo
from .serializers import StudentInfoSerializerclass DemoView(ModelViewSet):queryset = StudentInfo.objects.all()serializer_class = StudentInfoSerializer

路由代码,urls.py

from rest_framework.routers import SimpleRouter, DefaultRouter
from .views import DemoView
urlpatterns = []# demo_route = SimpleRouter()
demo_route = DefaultRouter()demo_route.register("demo", DemoView, basename="demo")urlpatterns += demo_route.urls

最后在项目的主路由里面添加路径即可(需要在settings.py里面注册app):

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("admin/", admin.site.urls),path("user/", include("user.urls")),path("", include("demo.urls"))
]

效果:
在这里插入图片描述
但是,这样会出现一个问题,就是无法控制序列化结果显示的字段。例如,在同一个项目中,可能会出现多个场景,一个场景只需要用户的name和sex字段,一个场景只需要用户的name字段,一个场景则需要用户的全部字段,按照以上方法就需要设置三个序列化器了,显然不符合实际应用。那么有没有办法可以兼顾便捷和灵活呢?

二、解决

解决方法很简单,重写序列化器的__init__()方法即可:
serializers.py

# 动态修改fileds字段
class StudentInfoSerializer(serializers.ModelSerializer):"""此处的`fields`字段是用来替换上面Serializer内部Meta类中指定的`fields`属性值"""def __init__(self, *args, **kwargs):# 在super执行之前# 将传递的`fields`中的字段从kwargs取出并剔除,避免其传递给基类ModelSerializer# 注意此处`fields`中在默认`self.fields`属性中不存在的字段将无法被序列化 也就是`fields`中的字段应该是`self.fields`的子集fields = kwargs.pop('fields', None)super(StudentInfoSerializer, self).__init__(*args, **kwargs)if fields is not None:# 从默认`self.fields`属性中剔除非`fields`中指定的字段(两个集合相减,会提出多余的元素)allowed = set(fields)existing = set(self.fields.keys())for field_name in existing - allowed:self.fields.pop(field_name)class Meta:model = models.StudentInfofields ="__all__"

以上代码的原理也很简单,首先获取传入的fields参数(即你想要的字段);然后使用序列化器原有的字段减去你想要的字段,就获取了多余的字段;最后,循环遍历多余的字段,将它们从原有的字段中一个一个剔除
为了更好的展示结果,我这里自定义了三个路径:
views.py

from django.shortcuts import render# Create your views here.
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from .models import StudentInfo
from .serializers import StudentInfoSerializerclass DemoView(ModelViewSet):queryset = StudentInfo.objects.all()serializer_class = StudentInfoSerializer@action(url_path="all_fields", methods=["GET"], detail=False)def all_fields(self, request):user_data = StudentInfo.objects.all()serializer = StudentInfoSerializer(instance=user_data, many=True)return Response(serializer.data)@action(url_path="name_sex", methods=["GET"], detail=False)def name_sex(self, request):user_data = StudentInfo.objects.all()serializer = StudentInfoSerializer(instance=user_data, fields=("name", "sex"), many=True)return Response(serializer.data)@action(url_path="name_fromclass", methods=["GET"], detail=False)def name_fromclass(self, request):user_data = StudentInfo.objects.all()serializer = StudentInfoSerializer(instance=user_data, fields=("name", "from_class"), many=True)return Response(serializer.data)

效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出,根据传入的fields的不同,返回不同的结果。

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

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

相关文章

威班11月份PMP模拟考试实录

11月份模拟考试于2023年11月18日在深圳市福田区鹏基商务时空大厦成功举办! 本次线下模拟考试依旧是通过线上线下同步的方式进行,在深圳周边的学员直接到达现场参与模拟考试,全国各地不能到达现场的其他学员已提前收到考试所需资料&#xff0…

C++ LibCurl实现Web指纹识别

Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术。这项技术旨在识别Web服务器、Web应用框架、后端数据库、JavaScript库等组件的版本和配置信息。通过分析HTTP响应头、HTML源代码、JavaScript代码、CSS文件等&#x…

【ARM Trace32(劳特巴赫) 使用介绍 2.3 -- TRACE32 进阶命令之 参数传递介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 参数传递命令 ENTRY 参数传递命令 ENTRY ENTRY <parlist>The ENTRY command can be used to Pass parameters to a PRACTICE script or to a subroutineTo return a value from a subroutine 使用示例&am…

《洛谷深入浅出基础篇》P3916 图的遍历——逆向搜索

上链接&#xff1a; P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3916上题干&#xff1a; 题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v) 表示从点 v 出发&#xff0c;能到…

合并区间(排序、贪心)

LCR 074. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

改进YOLOv8:结合Biformer——基于动态稀疏注意力构建高效金字塔网络架构

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

Unity 场景烘培 ——unity灯光和设置天空盒(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神指出。 文章目录 前言一、光源种类1.Directional Light(方向光&#xff0c;平行光)2.Point Light&#xff08;点光源&#xff09;3.Spotlight&#xff08;聚光灯&#xff09;4.Area Light&#xff08;区域光&#xff…

【C++】——多态性与模板(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

import.meta.glob() 如何导入多个目录下的资源

import.meta.glob() 如何导入多个目录下的资源 刚开始用 vite&#xff0c;在做动态路由的时候遇到了这个问题&#xff0c;看到其它教程上都是只引用了一个目录层级的内容&#xff0c;比如这样&#xff1a; let RouterModules import.meta.glob("/src/view/*/*.vue"…

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…

STM32定时器输入捕获测量高电平时间

STM32定时器输入捕获测量高电平时间 输入捕获测量高电平时间CuebMX配置代码部分 本篇内容要求读者对STM32通用定时器有一点理解&#xff0c;如有不解&#xff0c;请看 夜深人静学32系列15——通用定时器 输入捕获 输入捕获是STM32通用定时器的一种功能&#xff0c;可以捕获特定…

axios 请求合集

post 请求 请求负载请求参数&#xff08;Request Payload&#xff09; import axios from axios import qs from query-stringexport function getRoles(data){return axios.post(目标地址,data,{headers:{Content-Type: application/json,},}) }表单请求参数&#xff08;Form…

OGG-01224 Address already in use 问题

ERROR OGG-01224 Oracle GoldenGate Manager for Oracle, mgr.prm: Address already in use. ERROR OGG-01668 Oracle GoldenGate Manager for Oracle, mgr.prm: PROCESS ABENDING. 查看端口被占用情况&#xff1a; [rootcenterone ogg]# lsof -i:7809原因mgr 7809 端口被占…

Spring-IOC-@Value和@PropertySource用法

1、Book.java PropertySource(value"classpath:配置文件地址") 替代 <context:property-placeholder location"配置文件地址"/> Value("${book.bid}") Value("${book.bname}") Value("${book.price}") <bean id&…

MS90C386:+3.3V 175MHz 的 24bit 平板显示器(FPD)LVDS 信号接收器

产品简述 MS90C386 芯片能够将 4 通道的低压差分信号&#xff08; LVDS &#xff09;转换成 28bit 的 TTL 数据。时钟通道与数据通道并行输入。在时钟频率 为 175MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控制数据以 1225Mb…

Es 拼音搜索无法高亮

目录 背景&#xff1a; Es 版本&#xff1a; 第一步 第二步 &#xff08;错误步骤 - 只是记录过程&#xff09; 第三步 第四步 第五步 第六步 第七步 背景&#xff1a; app 原有的搜索功能无法进行拼音搜索&#xff0c;产品希望可以支持&#xff0c;例如内容中含有&a…

c++|内联函数

一、概念 以inline修饰的函数叫做内联函数&#xff0c;编译时c编译器会在调用函数的地方展开&#xff0c;而不会建立栈帧&#xff0c;提升了程序运行的效率 例子&#xff1a; #include <iostream> using namespace std;int Add(int left, int right) {return left - ri…

配置环境-insightface-torch

1. 创建环境&#xff1a;conda create -n insightface2 python3.8 2.安装pytorch: 我的cuda 是 11.3 然后进入 pytorch 官网查找对应cuda 版本 pytorch 安装 建议使用 pip # CUDA 11.3 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -…

openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库

文章目录 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库127.1 前提条件127.2 背景信息127.3 操作步骤 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库 127.1 前提条件 系统中需要有审计管理员或者具有审计管理员权…

Leetcode_48:旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…