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. 【C# 程序集】.NET core Could not load file or assembly

    NET core 添加了新的nuget包,部署出现Could not load file or assembly 这个坑,今天整了一天,我添加了Microsoft.AspNetCore.Mvc.Ver ...

  2. 调用WCF服务的几种方式

    首先发布了一个名为PersonService的WCF服务.服务契约如下: [ServiceContract]     public interface IPersonService     {     ...

  3. oj教程--贪心

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...

  4. selenium+python自动化102-登录页面滑动解锁(ActionChains)

    前言 登录页面会遇到滑动解锁,滑动解锁的目的就是为了防止别人用代码登录(也就是为了防止你自动化登录),有些滑动解锁是需要去拼图这种会难一点. 有些直接拖到最最右侧就可以了,本篇讲下使用 seleniu ...

  5. 01--c实现基础客户端和服务端与c++ boost.asio实现对比

    c实现服务端和客户端交互: 学习查阅的博客: https://blog.csdn.net/u011068702/article/details/54380259 https://blog.csdn.n ...

  6. TypeScript学习第二天:认识ts的数据类型

    目录 1,类型总览 2,基本类型 2.1,布尔 2.2,数字 2.3,字符串 2.4,Null 2.5,undefined 2.6,symbol 2.7,bigint 3,引用类型 3.1,数组 Ar ...

  7. 如何使用 PuTTY 远程连接矩池云主机

    PuTTY 是一款开源的连接软件,用来远程连接服务器,支持 SSH.Telnet.Serial 等协议. 矩池云的主机支持 SSH 登录,以下为使用 PuTTY 连接矩池云 GPU 的使用教程. 如您 ...

  8. 1.java连接pulsar服务

    目录 是什么 安装 Java客户端 1.引入GAV 2.创建配置项 3.验证测试 其他及代码下载 是什么 Pulsar 是一个用于服务器到服务器的消息系统,具有多租户.高性能等优势.详见 安装 本文主 ...

  9. Android 12(S) 图形显示系统 - BufferQueue/BLASTBufferQueue之初识(六)

    题外话 你有没有听见,心里有一声咆哮,那一声咆哮,它好像在说:我就是要从后面追上去! 写文章真的好痛苦,特别是自己对这方面的知识也一知半解就更加痛苦了.这已经是这个系列的第六篇了,很多次都想放弃了,但 ...

  10. linux中文件颜色,蓝色,白色等各自代表的含义

    linux中文件颜色,蓝色,白色等各自代表的含义 绿色文件---------- 可执行文件,可执行的程序 红色文件-----------压缩文件或者包文件 蓝色文件----------目录 白色文件- ...