djangoRestFrameWork的小知识

重写序列化器的save方法

  • 有时候,.create()和.update()方法名称可能没有意义。例如,在联系表格中,我们可能没有创建新实例,而是发送了电子邮件或登录(登录的时候用户名是唯一的,重写create方法来登录会报用户名已存在的错误)时,这时候可以直接重写save方法来完成相关的操作。

验证器

  • 单独字段验证方法默认为validate_{field_name},这个方法只有在当前的序列化器定义了这个字段时才会管用,如果直接在Meta里面指定的字段,那么它是不会被调用的,这时候只有在validate方法里面验证所有的字段

封装返回信息

  • 返回的response是由框架的dispatch方法返回的,这时候我们可以写一个mixin来封装框架的dispatch方法。
  • 使用mixin的好处是既可以不修改原来的处理逻辑和修改代码,还能对返回结果做一层封装
class UtilsDispatch(object):
def dispatch(self, request, *args, **kwargs):
# 一般都是获取response.data来作为返回对象,思路为将response的data封装返回
response = super().dispatch(request, *args, **kwargs)
# 这里可以通过response的状态码来进行不同的封装
status_code = response.status_code
# 自定义不同状态码的响应函数
handle_method = getattr(self, 'handle_%d_method' % status_code, None)
# return handle_method(request, response, *args, **kwargs) if handle_method is not None else response
if handle_method:
# 将响应和请求一并传入自定义的处理函数,方便调用和转换
return handle_method(request, response, *args, **kwargs)
return response # 简单定义一个响应创建成功的函数
def handle_201_method(self, request,response, *args, **kwargs):
# 将自定义的响应信息更新到response.data里面,返回response,前面就可以获取到自定义的响应信息了
response.data.update({'success': Ture, 'msg': '创建成功!'})
return response
  • 对需要实现自定义的视图类继承这个mixin类即可。

视图传参到序列化器

  • 对于有些默认的字段前端不会传递,但需要获取的,比如当前的用户,就需要将request.user传递到序列化器

  • request.data

    视图默认将request.data传递到序列化器,但是request.data是不可更改的属性,这个时候可以将request.data copy 一份,拿到copy后的对象,将需要传递的参数更新到copy对象中,再将copy的对象传入序列化器

    data = deepcopy(request.data)
    item = {'current_user': request.user}
    data.update(item)
    serializer = Serializer(data=data)

    传递的参数可以在序列化器中的initial_data中获取

  • initial_data

    和上述思路一样,可以将需要传递的信息传递到initial_data里面

    ```python
    serializer = Serializer(data=request.data)
    item = {'current_user': request.user}
    serializer.initial_data.update(item)
    ```
  • context

    rest框架在调用get_serializer方法的时候回去调用get_serializer_context,这个方法会将reuqtesformatview这三个参数到序列化器的context中,而视图中的大部分参数都可以通过这三个参数获取到,所有可以直接在序列化器中self.context中直接获取视图中参数。(如果重写了action方法,若没有调用父类的get_serializer,则不会将这个三个参数传递到序列化器中)

默认的字段

  • 上面说到的默认字段可以通过self.context来获取,有些字段其实可以直接被隐藏

    class BaseContext(object):
    # 定义基类
    def set_context(self, serializer_field):
    # get request from context
    self.request = serializer_field.context['request'] class CurrentUserDefault(BaseContext):
    # 继承Base基类,实现call方法
    def __call__(self):
    return self.request.user class DetailSerializer(ModelSerializer):
    # 直接将这个字段隐藏,默认为当前的用户,可以不用自定义来处理,序列化器自动将当前的用户赋值给这个字段
    user = serializers.HiddenField(default=CurrentUserDefault())
    ......

定制查询对象

  • 类原始的queryset对象因为拿不到任何的参数,所有很难根据当前的请求来进行filter查询

  • 重写get_queryset方法

    def get_queryset(self):
    # 根据request来定制查询
    return super().get_queryset().filter(user=self.request.user)

定制serializer_class

  • 有时候不同的请求不想使用类里面的serializer_class,但又不想在写一个视图,这时候就要根据不同的请求来调用不同的序列化器了

  • 直接看源码很清楚,框架是默认调用类制定的serializer_class,如果想定制,就得重写get_serializer_class

    class YourViewSet(ModelViewSet):
    # balabala
    serializer_class_route = {
    'list': xxxx,
    'create': xxxx,
    } def get_serializer_class(self, *args, **kwargs):
    if hasattr(self, 'serializer_class_route'):
    return self.serializer_class_route.get(self.action)
    return super().get_serializer_class(*args, **kwargs)

django_filter查询

  • django_filter是一个很好的查询工具,安装好之后可以在类里面直接定义一个查询的属性,而不用去创建一个filter对象类就可以完成查询功能

    class XXXX(ModelViewSet):
    # balabala
    filterset_fields = [field1, field2, .....]

删除自动生成路由的url末尾的小斜杠

  • 与 SimpleRouter 一样,通过在实例化 DefaultRouter 时将 trailing_slash 参数设置为 False,可以删除 URL 路径上的尾部斜杠。

    router = DefaultRouter(trailing_slash=False)

djangoRestFrameWork的小知识的更多相关文章

  1. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  2. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  3. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  4. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

  5. salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...

  6. Jquery:小知识;

    Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器   上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...

  7. HTML小知识---Label

    今天知道了一个html小知识: <input type="checkbox" id="chkVersion" />                 ...

  8. Unicode和汉字编码小知识

    Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...

  9. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

随机推荐

  1. C++中的内存分配

    C++提供下面两种方法分配和释放未构造的原始内存 (1)allocator 类,它提供可感知类型的内存分配 (2)标准库中的 operator new 和 operator delete,它们分配和释 ...

  2. gitbook 入门教程之超高颜值的思维导图simple-mind-map插件

    欢迎访问 gitbook-plugin-simple-mind-map 官网

  3. 使用 notepad 正则转换 字符串

    一..在一堆字符串中找出某一个特定格式的字符串,例如如下 需要摘出 WMID_abc WMID_def WMID_ghi {"abc",WMID_abc,oid_abc} {&qu ...

  4. 小白学 Python 数据分析(17):Matplotlib(二)基础操作

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  5. asp.net c# 通过消息队列处理高并发请求(以抢小米手机为例)

    网站面对高并发的情况下,除了增加硬件, 优化程序提高以响应速度外,还可以通过并行改串行的思路来解决.这种思想常见的实践方式就是数据库锁和消息队列的方式.这种方式的缺点是需要排队,响应速度慢,优点是节省 ...

  6. Numbers With Repeated Digits

    2020-01-03 12:01:46 问题描述: 问题求解: 确实可以当作数学题去做,但是要分类讨论什么的还是有点麻烦的. 这个时候万能的dfs上场了,直接暴力检索,真的太强了. int res = ...

  7. Javascript之网页版待办事项

    本文使用原生JS实现站点 http://www.todolist.cn/ 的基本功能. 其中页面的HTML布局和CSS样式取用原站,JS部分为自己编写. 效果图 完整代码 HTML.JS部分 < ...

  8. Linux基础篇学习——文件目录常用管理命令mkdir,cat,more,less,ln,file,cp,find,split,mv

    mkdir 创建目录 -p 递归创建目录 -v 显示创建信息 [root@zycentos7 ~]# mkdir -p {mylinux/{bin,conf,lib,logs,webapps/{doc ...

  9. mongodb_2

    一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...

  10. FaceBook 发布星际争霸最大 AI 数据集

    简介 我们刚发布了最大的星际争霸:Brood War 重播数据集,有 65646 个游戏.完整的数据集经过压缩之后有 365 GB,1535 million 帧,和 496 million 操作动作. ...