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. 技术管理进阶——为什么Leader的话有时候你听不懂

    原创不易,求分享.求一键三连 Hi,各位亲爱的小伙伴,小钗公号遵循日复盘->周复盘->月复盘->季度复盘->年总结策略,所以某类型文章到后期才会成体系. 今天这篇文章属于「月复 ...

  2. 【C# 集合】Hash哈希函数 |散列函数|摘要算法

    希函数定义 哈希函数(英語:Hash function)又称散列函数.散列函数.摘要算法.单向散列函数.散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该函数将数据打乱混合,重新 ...

  3. C#(1):XML DOM、System.Xml.XmlDocument

     一.XML DOM概述 XML 文档大小写敏感.属性用引号括起来,每一个标记都要闭合. DOM是XML文档的内存中树状的表示形式. 继承关系图: XmlNode;//XML节点 ......Xml ...

  4. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  5. JVM学习笔记(详细)

    目录 01 JVM与Java体系结构 简介 JVM整体架构,HotSpot java代码执行流程 JVM架构模型 JVM生命周期 JVM发展历程 02 类加载子系统 JVM细节版架构 类加载器的作用 ...

  6. input框限制输入金额

    HTML: <input type="tel" class="capital mui-input-clear" value="0.00" ...

  7. Cache写机制

    Cache 写机制分为:Write-through和Write-back Write-through(直写模式) 定义:在数据更新时,同时写入缓存Cache和后端存储(主存): 优点:操作简单: 缺点 ...

  8. SpringMVC入门二:SSM整合(spring+springmvc+mybatis)

    一.编程步骤 1.引入依赖 spring.springmvc.mybatis.mybatis-spring.mysql.druid.log4j.servlet-api.jstl.fastjson 2. ...

  9. Java 将XML转为PDF

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性.通过将XML转换为PDF,能够便于文件传输及共享.本文,将介绍通过Java代码来实现该格式转换的方法. ...

  10. ## [湖南省赛2019]Findme ###

    [湖南省赛2019]Findme 1.题目概述 2.解题过程 010打开这几张图片 先简单分析一下这几张图片 简单分析 1.png 从外观上,1.png明显高度太低,需要更改 2.png 2.png末 ...