django-rest-framework文档导读

article/2025/10/12 20:14:50

django-rest-framework文档导读

    • 技巧
    • 反序列化
      • 校验数据
      • 保存数据
      • ModelSerializer简化代码
    • APIView
      • request/response
      • GenericAPIView+Mixin
        • ListAPIView
        • CreateAPIView
        • RetrieveAPIView
        • DestroyAPIView
        • UpdateAPIView
        • ListCreateAPIView
        • RetrieveUpdateAPIView
        • RetrieveDestroyAPIView
        • RetrieveUpdateDestroyAPIView
    • ViewSet
      • GenericViewSet
      • ModelViewSet
      • RealOnlyModelViewSet
    • Router
    • 异常处理

今天重新看了一遍drf的文档,真的是豁然开朗,以前写的时候都是不求甚解,直接cv,现在知道为什么这么写了

技巧

  1. data直接模拟来自客户端数据, 不用request.data
  2. 字典用get,不要用[],容易报错
  3. request.POST的类型是QueryDict,和普通的Dict不同的是,如果使用get,只能获得数组的最后一个数,必须使用getlist才能获取list

反序列化

校验数据

字段选项,都是反序列化需要

max_length
min_length
allow_blank
trim_whitespace 截断空白符
max_value
min_valuevalidaters = [序列化器外部的验证函数]required = False 反序列化时可以不提供,不会报错read_only = True 前端提交的数据不应该有这个字段,有的话被忽略
wirte_only = True 对象转化成字典时,不需要这个字段
err_message = {'min_value': '小于最小值'} 自定义验证字段报错信息

反序列化基本步骤

1. 实例化serializer对象
xx = XXSerializer(data=xxxx)
2. 校验数据
xx.is_valid()
3. 获取验证数据
xx.validated_data
4. 获取验证报错
xx.errors # dict key为字段
2. 直接抛出异常,不需要4
xx.is_valid(raise_exception=True)
4. 保存
xx.save()
5. 返回
xx.validated_data

验证

1. 抛出异常
raise serializers.ValidationError(detail="xxxx", code="validate_name")
2. 验证来自客户端所有数据 
def validate(self, attrs)
3. 验证单一字段xxx
def validate_xxx(self, data)

保存数据

def create(self, validated_data):return xxx_model.objects.create(**validated_data)
def update(self, instance, validated_data):# instance.xx = validated_data['xx']setattr(instance, key, value)instance.save()  # django没有update方法return instance
更新操作:
1. 实例化 partial=True允许只传入部分字段更新,不验证其它字段
serializer = XXSerializer(instance=instance, data=data, partial=True)
2. 校验
xx.is_valid(raise_exception=True)
3. 保存
serializer.save()  # 可以传不需要校验的数据 如owner=request.user
4. 返回
serializer.validated_data

ModelSerializer简化代码

class Meta:model = Userfields = ['id', 'name']exclude = [排除的字段]  # 少用read_only_fields = ['id']  # 只读 即只有序列化时候才用的字段extra_kwargs = {  #  字段的选项'字段名': {'选项': value,},如:'name': {'max_length': 10}}
重写create方法
def create(self, validated_data):validated_data['password'] = make_password(validated_data['password'])super().create(validated_data)

模型中没有声明的字段可以自己加,自己加的没有值不会返回,model导入的一定会返回(null)

APIView

基本视图,继承自View,升级了request/response/as_view/异常处理方法

新增类属性:

1. authentication_classes 身份认证
2. permission_classes     权限检查
3. throttle_classes       流量控制

方法(需要自己写):

  1. get
  2. post
  3. patch
  4. put
  5. delete

request/response

request.data     # body/json/file 都可以解析
request.query_params
request._request # django原生request
response(headers={'flag': '123456'}) # 自定义响应头

GenericAPIView+Mixin

GenericAPIView通用视图,继承自APIView

新增类属性:

1. queryset 
2. serializer_class
3. lookup_field     用于数据库查询字段名
4. lookup_url_kwarg 前端传过来的字段名

新增类方法:

1. get_queryset()
2. get_serializer() 多个serializer需要重写 一般不用_class的
3. get_object()  使用lookup_field参数在queryset中查/重写以提供基于多个参数查
4. filter_object() 

Mixin类,提供了增删查改的几个方法

1. ListModelMixin     提供list方法
2. CreateModelMixin   提供create方法
3. RetrieveModelMixin 提供查询单个对象方法
4. UpdateModelMixin   更新/partial=True部分更新
5. DestroyModelMixin  删除

ListAPIView

继承自GenericAPIView和ListModelMixin,提供了get方法,里面调用了mixin类里的list方法,下面都类似,一看名字就知道了,不一一介绍了

CreateAPIView

RetrieveAPIView

DestroyAPIView

UpdateAPIView

ListCreateAPIView

RetrieveUpdateAPIView

RetrieveDestroyAPIView

RetrieveUpdateDestroyAPIView

ViewSet

继承自APIView,更加简化代码,可以把多个相关的视图放到一块儿,搭配独特路由器机制,as_view中绑定请求method到视图的方法list/create/retrieve/update/destroy,但不提供这些方法实现,需要自己写

XXXViewSet.as_view({'get': 'list/自己的方法名···'})

GenericViewSet

继承自GenericAPIView,不是ViewSet,也是不提供crud方法

ModelViewSet

继承自GenericViewSet和所有mixin类,提供完整crud方法

RealOnlyModelViewSet

继承自GenericViewSet+RetrieveModelMixin+ListModelMixin

Router

路由,自动绑定method到视图集方法

router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)
urlpatterns = router.urls

自定义方法绑定

@detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf], url_path='yyyyyy')
def xxxxxx(self, request, **kwargs)router自动生成这样的url: aaa/{pk}/yyyyyy或者直接action绑定,和上面的类似
@action(methods, detail=True/False, url_path, url_name)

异常处理

自定义异常处理

from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):response = exception_handler(exc, context) # 先调用drf生成一个标准的if response is not None:response.data['status_code'] = response.status_code  # 向response里传数据 return response

http://chatgpt.dhexx.cn/article/DKUblNdG.shtml

相关文章

Django Rest Framework中文文档:Serializer relations

文章目录 一,django模型间的关系二,检查序列化器实例详情三,序列化关系字段(一)StringRelatedField(二)PrimaryKeyRelatedField(三)HyperlinkedRelatedField(…

Django官方文档

一、文档地址 https://docs.djangoproject.com/zh-hans/3.2/ 1.1 编写你的第一个 Django 应用,第 1 部分 1.1.1 创建项目 使用django的系统工具django-admin执行指令,即可创建 django-admin startproject mysite 目录结构显示如下 mysite/manage.…

WPF:WPF原生布局说明

前言 WPF在国内讨论度很小,我在这里记录一下WPF简单的原生控件是如何使用的,顺便回忆一下WPF的基础知识,有些忘记的比较厉害了 WPF简介 WPF是微软推出的桌面UI软件,是我觉得最早实现MVVM(数据驱动事务)&…

WPF界面美化(整体作用到控件),一步步教你使用FirstFloor.ModernUI

开发工具:VS2015 1、获取相关DLL(通过NuGet或者GitHub上下载的源码中获得),并在项目中添加引用 FirstFloor.ModernUI.dll Microsoft.Windows.Shell.dll UIShell.OSGi(这个是我运行程序时报的错误"未能加载文件或程序集",然后在…

WPF 极简风格登录界面

UI使用MaterialDesign,先看界面 一、界面 极简登录界面 二、下载MaterialDesign包 我使用的是VS2019,选择要引入MaterialDesign包的项目,鼠标右击选择NuGet程勋包 在浏览页签中输入MaterialDesign,下载MaterialDesignColors和Ma…

WPF绘制自定义窗口

简介: 原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态栏 窗体的半…

WPF简单UI菜单设计

UI效果如下&#xff1a; XAML 设计&#xff1a; <Window x:Class"简单菜单设计.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://…

WPF真入门教程05--UI布局2

这一节&#xff0c;来学习下ComboBox下拉框&#xff0c;Border边框控件&#xff0c;Image图片控件&#xff0c;CheckBox复选框&#xff0c; 这些发挥着不同的作用&#xff0c;是布局基础组成部分&#xff0c;从左侧拖控件到右边&#xff0c;完成以下代码&#xff1a; <Wind…

WPF基本介绍

WPF基本介绍 WPF&#xff08;Windows Presentation Foundation&#xff09;是&#xff08;微软推出的&#xff09;基于Windows的用户界面框架&#xff0c;属于.NET Framework 3.0的一部分。WPF提供了统一的编程模型&#xff0c;语言和框架&#xff0c;做到了分离界面设计人员与…

WPF UI介面的革新

透過 Microsoft 對 Windows Vista 及 WPF 的強力行 銷&#xff0c;相信許多讀者對於WPF的UI能力只有驚豔二字可以形容&#xff0c;對於如何使用WPF來達到這些效果&#xff0c;基於雜誌與網路上已有相當多的文章討論&#xff0c;筆者於此就不再重述了&#xff0c;直接將主軸放在…

WPF界面设计—撸大师

WPF界面设计,模仿了金山卫士,360,鲁大师的界面! <!--无边框窗体--><Style x:Key="NoResize_window" TargetType="{x:Type Window}"> <Setter Property="AllowsTransparency" Value="true"/> <Setter Prope…

WPF - 简单的UI框架

实现了一个简单的WPF应用程序UI框架 &#xff0c;分享出来。界面效果图如下&#xff1a; 运行效果如下&#xff1a; 打算持续更新&#xff0c;将左侧面板所有功能模块全给实现了。 喜欢的可以下载源码体验&#xff1a;https://github.com/DuelWithSelf/WPFEffects 左侧分类导览…

WPF真入门教程04--UI布局1

大家都知道&#xff1a;UI是做好一个软件很重要的因素&#xff0c;如果没有一个漂亮的UI&#xff0c;功能做的再好也无法吸引很多用户使用&#xff0c;而且没有漂亮的界面&#xff0c;那么普通用户会感觉这个软件没有多少使用价值。 WPF系统基于流布局的标准&#xff0c;开发人…

WPF UI界面控件篇

WPF UI界面控件篇 布局控件&#xff1a;是任何用户界面的基础&#xff0c;排列应用中的 UI 元素。 文本、按钮和图像等元素都需要规定自己位置和行为方式&#xff0c;构建基块称为“控件”&#xff0c;有时亦称为“元素”。 <Window x:Class"UsingLayoutsApp.Wpf.Mai…

WPF(一) WPF基本控件与布局

​ WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的基于Windows的用户界面框架&#xff0c;中文译为“Windows呈现基础”&#xff0c;属于.NET Framework 3.0的一部分。WPF类似于WinForm技术框架&#xff0c;但是相比于WinForm&#xff0c;WPF对大部分…

WPF炫酷界面设计

一.效果展示&#xff08;多层次&#xff09; 二.制作流程 1.在vs2012中建立一个wpf程序 2.建立一个主页面&#xff08;.cs&#xff09;(注&#xff1a;C#程序每一个页面都由两个文件构成一个axml一个cs&#xff0c;一个前端文件一个后台文件) 3.在主页面中添加按钮&#xff0c;…

WPF界面设计工具---Blend学习(一)

文章目录 前言一.初用Blend之喜二.使用Blend1.Blend工具版本 前言 最近在空闲时间学习WPF界面设计工具Blend&#xff0c;之前写WPF的界面都是完全依靠手敲代码的方式&#xff0c;这种方式往往很低效率而且很难做到一些复杂的效果。比如动画&#xff0c;手敲代码实现动画的话&a…

C# WPF 一个设计界面

微信公众号&#xff1a;Dotnet9&#xff0c;网站&#xff1a;Dotnet9&#xff0c;问题或建议&#xff1a;请网站留言&#xff0c; 如果对您有所帮助&#xff1a;欢迎赞赏。 C# WPF 一个设计界面 今天正月初三&#xff0c;大家在家呆着挺好&#xff0c;不要忘了自我充电。 武汉…

WPF界面设计

目录 1.设计一个优美的注册界面1.实现效果2.代码展示 2.简易登录按钮设计1.实现效果2.代码展示 3.设计一个优美的注册登录界面&#xff08;连接数据库&#xff09;1.实现效果2.代码展示 4.设计一个简单的在线教育系统界面1.实现效果2.代码展示 5. 设计一个Dashboard1.实现效果2…

WPF实例系列一:登录、注册界面设计

WPF实例系列一&#xff1a;登录、注册界面设计 文章目录 WPF实例系列一&#xff1a;登录、注册界面设计前言一、实例演示1. 登录界面展示2. 注册界面展示3. 数据存储4. 效果演示 二、结构及源码1.主界面跳转登录界面设计2.登录界面设计3.注册界面设计4.Excel保存数据类设计5.源…