序列化器中update、create和视图中的update、create

在序列化器中和视图中,都可以重写updatecreate方法,但两者有什么区别呢?

说实话,我还未搞懂,看不懂源码。这里我可以拿笔记中的案例来分析分析。

本笔记中有以下models

from django.db import modelsclass Company(models.Model):company_name = models.CharField(max_length=50)def __str__(self):return self.company_nameclass Tag(models.Model):tag = models.CharField(max_length=30)def __str__(self) -> str:return self.tagclass User(models.Model):STATUS_CHOICE = (('1', '有效账号'),('2', '无效账号'))user_name = models.CharField(max_length=20, unique=True)nick_name = models.CharField(max_length=30, unique=True)password = models.CharField(max_length=20)company = models.ForeignKey(Company, on_delete=models.DO_NOTHING)status = models.CharField(max_length=20, choices=STATUS_CHOICE, default=1)tags = models.ManyToManyField(Tag)def __str__(self) -> str:return self.user_name

其中,password的字段,设置成了序列化时不传送到前端,反序列化时必须要提供(其他字段没这个困扰,毕竟谁会把密码传送到前端呢?)。但是前端在修改数据时,不一定会修改password,那么数据传到后端时要判断一下,如果前端不修改密码的话,那就使用实例原有的密码。

那么,问题来了。

如果前端不修改密码,则使用实例密码 这个步骤需要重写update方法,要重写哪个update呢?是序列化器中的,还是视图中的?也就是说,要在视图拿到数据判断还是数据反序列化时判断?

  • 先看看序列化器中的update
def update(self, instance, validated_data):instance.password = validated_data.get('password', instance.password)return super().update(instance, validated_data)

这里需要注意形参validate_data,它是一个经过drf校验的字典,里面的数据来源于request.data

当前端不修改密码,request.data中必定不包含password的键值对,那这个request.data没办法通过drf的校验,那自然不会存在所谓的validate_data

经过实践,修改密码的这个需求不能在序列化器中重写update实现,可以在视图中重写update实现。代码如下:

class UserViewSets(viewsets.ModelViewSet):queryset = User.objects.all()def get_serializer_class(self):serializer_class = self.serializer_class #由于封装中内置了serializer_class,所以这里必须使用self.serializer_class,否则serializer_class就变成一个新的变量了if self.request.method in ('PUT', 'POST',):serializer_class = UserModelPostPutif self.request.method in ('GET', ):serializer_class = UserModelGetSerializerreturn serializer_classdef update(self, request, *args, **kwargs):if not request.data.get('password'):password = User.objects.get(id=request.data['id']).passwordrequest.data['password'] = passwordreturn super().update(request, *args, **kwargs)return super().update(request, *args, **kwargs)def destroy(self, request, *args, **kwargs):super().destroy(request, *args, **kwargs)return Response('删除')

还未尝试过create方法,不过原理差不多,想要在序列化器中重写update create,必须确保request.data能通过drf的校验,这样才能有validate_data

我想,应该还有另外一个区别。

序列化器是可以重复调用的,对应的update create方法也一样可以重复调用。而视图可以有很多个,比如基于@api_view实现的,基于APIView实现的,还有其他方法实现的视图,如果每个视图都要重写一遍update那可是很麻烦的。

好了,以后若有新的领悟,再来更新。

接下来要学习认证了。

Django REST Framework笔记(六)重写序列化器的update和create方法相关推荐

  1. Django REST Framework教程(4): 玩转序列化器(Serializer)

    在前面的文章中我们以博客为例,自定义了一个简单的 ArticleSerializer 类, 并分别以函数视图(FBV)和基于类的视图(CBV)编写了博客文章列表资源和单篇文章资源的API,支持客户端以 ...

  2. 快速上手Django(六) -Django之Django drf 序列化器Serializer类

    文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...

  3. Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer

    文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...

  4. Django Rest framework (看完直接上手用)

    Restframework DjangoRestframework 主要使用 APIView 类,其 APIView 实质是对 View 进行继承加工了更多功能 请求进来 APIView() 首先执行 ...

  5. 挑战全网最全之django REST framework(DRF)教程

    一.认识DRF 1.restful简介 在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查. restful是一种后端API接口规范 ...

  6. DRF (Django REST framework) 中的视图类

    视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...

  7. Serializers - Django REST framework

    序列化器-Django REST框架 serializers.py 串行化 扩展序列化程序的有用性是我们想要解决的问题.然而,这不是一个微不足道的问题,它将需要一些认真的设计工作. 拉塞尔·基思-马吉 ...

  8. Django Rest Framework的使用整理

    Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...

  9. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

最新文章

  1. 【Git】git的基本使用
  2. Java开发中 Double 和 float 不能直接运算
  3. SVD(6.5.1定理证明观察3)
  4. 二:前端css,即选择器
  5. jquery回显select标签
  6. Hibernate简介
  7. python 类和对象_面向对象的编程思想和Python的类,访问和属性,继承
  8. 计算机组成 冯诺依曼体制
  9. 二分图匹配 + 最小点覆盖 - Vertex Cover
  10. 平稳过程的各态历经性
  11. net 4.6.2安装不成功_源泉设计安装不成功的问题之解决办法
  12. NB-IOT基础模型搭建思路
  13. 绿色建筑推动海口智慧城市发展
  14. 目前的物联网产品,主要有哪些?
  15. 立创EDA学习3-绘制pcb(初级)
  16. redis连接与关闭
  17. app开屏广告实现——借助webview和原生fetch请求实现
  18. 2016年7月17日学习 scratch 钢琴键
  19. 摄影师的“伟大”!分享一组高大上的“照骗”的前期与后期
  20. elastic-search学习笔记

热门文章

  1. RGB图像转换到CIELab空间的研究及优化
  2. KK(凯文·凯利)给年轻人的建议
  3. 对凯恩期《通论》的一点随想
  4. Matlab中的lower函数
  5. AD 多边形 圆形 快速覆铜
  6. java英文字母排序_Java编程实现中英混合字符串数组按首字母排序的方法
  7. 读刘未鹏《暗时间》有感
  8. 中e管家投资理财小要点
  9. 中国联通5G终端白皮书——第三阶段
  10. Anaconda+tensorflow+win10安装包和教程(2021年12月)