1.djangorestframework使用

  1. 下载安装
pip install djangorestframework  ## djangorestframework
pip install django-filter ## 过滤使用
  1. 注册
INSTALLED_APPS = [
...
'rest_framework',
'django_filters'
]
  1. model
class Feedback(models.Model):
type_choice = (
(0, '未分类'),
(1, '学习笔记'),
(2, '学员评价'),
(3, '入职邀约'),
) img = models.ImageField(upload_to='img/feedback/')
back_type = models.IntegerField(choices=type_choice, default=0)
  1. 路由
url(r'^ajax_feedback/', views.AjaxFeedback.as_view()),
  1. 视图
from rest_framework import generics
from web.serializers import FeedbackSerializer
from web.pagination import DefaultPagination
from django_filters.rest_framework import DjangoFilterBackend class AjaxFeedback(generics.ListAPIView):
queryset = models.Feedback.objects.all()
serializer_class = FeedbackSerializer
pagination_class = DefaultPagination
filter_backends = [DjangoFilterBackend, ]
filter_fields = ['back_type']
  1. 序列化器类
from rest_framework import serializers
from repository import models class FeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = models.Feedback
fields = ['img']
  1. 分页类
from rest_framework.pagination import PageNumberPagination

class DefaultPagination(PageNumberPagination):
page_size = 8 # 一页多少条数据
page_query_param = 'page' # 分页查询条件的key
page_size_query_param = 'size'
# max_page_size = 8

2.序列化器serializer

序列化: 将对象,字符串等数据类型转化为可用于传输/存储的数据形式

  • -----serializer文件-----
from rest_framework import serializers
from app01 import models # 获取外键名称
class PublisherSerializer(serializers.Serializer):
name = serializers.CharField() # 1.自定义序列化器获取manytomany外键名称
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField() class BookSerializer(serializers.Serializer):
# 要序列化的书籍参数
title = serializers.CharField()
price = serializers.DecimalField(max_digits=6, decimal_places=2)
pub_date = serializers.DateTimeField()
# 仅仅在get需要的字段
pub = PublisherSerializer(required=False, read_only=True) # 获取外键字段名称,自定义序列化器
authors = serializers.SerializerMethodField(read_only=True) # 获取多对多字段名称 1.自定义序列化器 2.自定义 get_字段名字段名 # 仅仅在post需要的字段
post_pub = serializers.IntegerField(write_only=True)
post_author = serializers.ListField(write_only=True) # 2.自定义 get_字段名
def get_authors(self, obj): # obj是书籍对象
ser_obj = AuthorSerializer(obj.authors.all(), many=True)
return ser_obj.data # 新建数据写入数据库时自定义create方法
def create(self, validated_data):# validated_data校验过的数据
# 写入数据
book_obj = models.Book.objects.create(
title=validated_data['title'],
price=validated_data['price'],
pub_date=validated_data['pub_date'],
pub_id=validated_data['post_pub']
)
book_obj.authors.set(validated_data['post_author'])
return book_obj # put方法执行到save方法是,执行update
def update(self, instance, validated_data):
instance.title = validated_data.get('title',instance.title)# 使用get请求方法防止在部分修改数据时报错
instance.price = validated_data.get('price',instance.price)
instance.pub_date = validated_data.get('pub_date',instance.pub_date)
instance.pub_id = validated_data.get('post_pub',instance.pub_id)
instance.save()
instance.authors.set(validated_data.get('post_authors',instance.authors.all()))
return instance
  • -----view文件-----
from app_rest import models

from rest_framework.views import APIView
from rest_framework.response import Response # rest_framework返回对象
from app_rest.serializer import BookSerializer class BookList(APIView):
"""查询新增""" # 获取数据
def get(self, request, *args, **kwargs):
all_books = models.Book.objects.all()
ser_data = BookSerializer(all_books, many=True) # many=True可以加入一个对象列表,单个对象不需要加入many参数
return Response(ser_data.data) # 提交数据
def post(self, request, *args, **kwargs):
ser_obj = BookSerializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
return Response(ser_obj.errors) class BookView(APIView):
"""修改删除""" def get(self, request, pk, *args, **kwargs):
"""查询到要修改的数据"""
book_obj = models.Book.objects.filter(pk=pk).first()
ser_obj = BookSerializer(instance=book_obj)
return Response(ser_obj.data) def put(self, request, pk, *args, **kwargs):
"""
提交要修改的数据
:return:
"""
book_obj = models.Book.objects.filter(pk=pk).first()
ser_obj = BookSerializer(instance=book_obj, data=request.data, partial=True) # partial=True 允许部分修改
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
return Response(ser_obj.errors) def delete(self, request, pk, *args, **kwargs):
"""删除"""
obj = models.Book.objects.filter(pk=pk).first()
if obj:
obj.delete()
return Response({'msg': '删除成功'})
return Response({'error': '数据不存在'})
  • ---data.json---需要数据结构

    {
    "title": "桃花侠大战菊花怪1",
    "price": "111.11",
    "pub_date": "2019-01-01T10:10:10Z",
    "post_pub": 1,
    "post_author": [
    1,
    2
    ]
    }

3. 序列化器钩子

  • 自定义校验器

    from rest_framework import serializers
    
    def validate_title(value):
    if '苍老师' in value:
    raise serializers.ValidationError
    return value class BookSerializer(serializers.Serializer):
    # 要序列化的书籍参数
    title = serializers.CharField(validators=[])
  • 局部钩子与全局钩子

    class BookSerializer(serializers.Serializer):
    title = serializers.CharField()
    price = serializers.DecimalField(max_digits=6, decimal_places=2)
    pub_date = serializers.DateTimeField()
    # 仅仅在get需要的字段
    pub = PublisherSerializer(required=False, read_only=True) # 获取外键字段名称,自定义序列化器
    authors = serializers.SerializerMethodField(read_only=True) # 获取多对多字段名称 1.自定义序列化器 2.自定义 get_字段名字段名 # 仅仅在post需要的字段
    post_pub = serializers.IntegerField(write_only=True)
    post_author = serializers.ListField(write_only=True) # 2.自定义 get_字段名
    def get_authors(self, obj): # obj是书籍对象
    ser_obj = AuthorSerializer(obj.authors.all(), many=True)
    return ser_obj.data # 局部钩子
    def validate_title(self,value):
    if '苍老师' in value:
    raise serializers.ValidationError
    return value # 全局钩子
    def validate(self,attrs):
    if '苍老师' in attrs:
    raise serializers.ValidationError
    return attrs

4.modelserializer

from rest_framework import serializers

# 获取外键名称
class PublisherSerializer(serializers.Serializer):
name = serializers.CharField() # 1.自定义序列化器获取manytomany外键名称
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField() # 显示字段
class BookSerializer(serializers.modelSerializer): # 显示外键以及多对多字段的name
pub_info = serializers.SerializerMethodField(read_only = True )
authors_info = serializers.SerializerMethodField(read_only = True ) def get_pub_info(self,obj):
return PublisherSerializer(obj,pub).data def get_authors_info(self,obj):
return AuthorSerializer(obj,author.all(),many = True).data class Meta:
model = models.Book
fields = '__all__' #给字段加限制
extra_kwargs = {
'pub':{'write_only':True},
'authors':{'write_only':True}
}

DRF 简单使用(详细注释版)的更多相关文章

  1. 经典剪枝算法的例题——Sticks详细注释版

    这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...

  2. SSM+shiro,所有配置文件,详细注释版,自用

    spring配置文件applicationContext.xml,放在resources下 <?xml version="1.0" encoding="UTF-8& ...

  3. SSM+shiro及相关插件的整合maven所有依赖,详细注释版,自用,持续更新

    整合了SSM+shiro框架,slf4j+logback日志,及一些好用的插件PageHelper,mybatis-generator,Lombok,fastjson等等 <?xml versi ...

  4. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  5. MFC的PNG贴图按钮类(详细注释)

    MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 萌新第二次写帖子,请多多包涵.末尾附上相应代码(PS公司繁体系统所以部分注释繁体请别介意). 因自带控件不美观,于是网上参考学 ...

  6. Qt5_简易画板_详细注释

    代码下载链接:  http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...

  7. PL/0与Pascal-S编译器程序详细注释

    学校编译课的作业之一,要求阅读两个较为简单的编译器的代码并做注释, 个人感觉是一次挺有意义的锻炼, 将自己的心得分享出来与一同在进步的同学们分享. 今后有时间再做进一步的更新和总结,其中可能有不少错误 ...

  8. 一套强大的vim配置文件+详细注释

    phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...

  9. dedecms首页入口的详细注释

    今天闲来无事,就拿来dede首页的文件给大家详细解释一遍,以便于新手学习,注释过程非常非常非常的详细,里面解释到dede表前缀#@__代替的原理.解释到dede很多自定义函数的具体位置和具体作用等等疑 ...

随机推荐

  1. 用这个BI工具,不会代码的业务人员也能做数据分析!

    随着企业的迅速发展,企业对数据分析的需求也在不断地凸显,但我们在实际的工作中经常会遇到这样尴尬的情形:擅长数据分析的人不懂业务,擅长业务的人又不了解数据分析.那么怎么让更懂业务逻辑.业务分析需求和痛点 ...

  2. 基于隐私保护技术的DNS通信协议介绍

    本文提出了一种基于用户数据报协议的DNS传输中用户隐私保护的加密方法:DNSDEA.该方法采用PKI加密体系与DNS协议相融合,不仅解决了域名隐私保护问题,而且与传统DNS体系相兼容,保持了DNS系统 ...

  3. 《Selenium+Pytest Web自动化实战》视频试听课程

    环境准备 1.1 python3环境安装 1.2 selenium3和chrome环境 1.3 pycharm安装 webdriver API 2.1基本操作 2.2元素定位id_name_class ...

  4. omnet++:官方文档翻译总结(五)

    Part 6 - 用IDE将结果可视化 学习翻译自:Visualizing the Results - OMNeT++ Technical Articles ①将输出的数值和向量数据可视化(用tict ...

  5. 【python画圆】pip安装库时出现Read timed out.解决办法

    昨天第一次用python画圆,当时并没有安装numpy库(导入数据包)和matplotlib库(导入图形包),于是尝试用pip安装库 首先,我先更新了pip,如下图: 顺便附上成功截图: 然后安装nu ...

  6. JZ-026-二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目链接: 二叉搜索树与双向链表 代码 /** * ...

  7. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  8. (八)使用 jmh 压测 Dubbo

    1.JMH简介 JMH即Java Microbenchmark Harness,是Java用来做基准测试的一个工具,该工具由OpenJDK提供并维护,测试结果可信度高. 相对于 Jmeter.ab , ...

  9. petite-vue源码剖析-双向绑定`v-model`的工作原理

    前言 双向绑定v-model不仅仅是对可编辑HTML元素(select, input, textarea和附带[contenteditable=true])同时附加v-bind和v-on,而且还能利用 ...

  10. VUE3 之 列表动画 - 这个系列的教程通俗易懂,适合新手

    1. 概述 老话说的好:可以为别人解决痛点的产品就是好产品. 言归正传,今天我们来聊聊 VUE 的列表动画. 2. 列表动画 2.1  列表中增加和删除元素 <style> .my-ite ...