DRF 简单使用(详细注释版)
1.djangorestframework使用
- 下载安装
pip install djangorestframework ## djangorestframework
pip install django-filter ## 过滤使用
- 注册
INSTALLED_APPS = [
...
'rest_framework',
'django_filters'
]
- 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)
- 路由
url(r'^ajax_feedback/', views.AjaxFeedback.as_view()),
- 视图
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']
- 序列化器类
from rest_framework import serializers
from repository import models
class FeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = models.Feedback
fields = ['img']
- 分页类
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 简单使用(详细注释版)的更多相关文章
- 经典剪枝算法的例题——Sticks详细注释版
这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...
- SSM+shiro,所有配置文件,详细注释版,自用
spring配置文件applicationContext.xml,放在resources下 <?xml version="1.0" encoding="UTF-8& ...
- SSM+shiro及相关插件的整合maven所有依赖,详细注释版,自用,持续更新
整合了SSM+shiro框架,slf4j+logback日志,及一些好用的插件PageHelper,mybatis-generator,Lombok,fastjson等等 <?xml versi ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- MFC的PNG贴图按钮类(详细注释)
MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 萌新第二次写帖子,请多多包涵.末尾附上相应代码(PS公司繁体系统所以部分注释繁体请别介意). 因自带控件不美观,于是网上参考学 ...
- Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...
- PL/0与Pascal-S编译器程序详细注释
学校编译课的作业之一,要求阅读两个较为简单的编译器的代码并做注释, 个人感觉是一次挺有意义的锻炼, 将自己的心得分享出来与一同在进步的同学们分享. 今后有时间再做进一步的更新和总结,其中可能有不少错误 ...
- 一套强大的vim配置文件+详细注释
phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...
- dedecms首页入口的详细注释
今天闲来无事,就拿来dede首页的文件给大家详细解释一遍,以便于新手学习,注释过程非常非常非常的详细,里面解释到dede表前缀#@__代替的原理.解释到dede很多自定义函数的具体位置和具体作用等等疑 ...
随机推荐
- 企业bi解决方案,商业智能BI作用
随着越来越多的公司将商业智能BI引入到日常运营和商业决策中,BI的热点逐渐起来了.商业智能系统兴起,那BI对企业有什么好处呢? 简单的说,就是可以帮助企业管理者直观清晰的看到自己想要关注的数据,帮助 ...
- 【C# 程序集】把自己的程序集添加|卸载 到GAC 全局程序集缓存中
添加全局程序集缓存 Global Assembly Cache Tool (Gacutil.exe) 操作环境windows10+vs2019 cmd.exe位置在 C:\Windows\System ...
- AHUACM寒假集训I(基础数据结构+串串)
H.超级钢琴 luoguP2048 题目大意: 求出一个长N序列中所有长度在L到R的子序列中序列和最大的K个,并求这K个的和 思路: 暴力的话可以求出所有满足要求的子序列然后排序,然后显然会T. 所以 ...
- omnet++:官方文档翻译总结(一)
1.什么是omnet++ 翻译总结自:What is OMNeT++? omnet++是用来进行网络仿真的C++库和框架.这里的网络包括有线.无线.on-chip.queueing网络等等.特定领域中 ...
- laravel 公共类json库封装
封装常用的接口响应: 创建 response.php 在app下创建如下文件下(目录及文件名可以自己设置) app/common/response.php,在内部补充如下代码: <?php /* ...
- Sublime Text3中文环境设置
Sublime Text3中文环境设置 1.首先打开安装好的的Sublime软件,选择Preferences下面的Package Contorol选项出现弹窗方框 2.在弹窗输入install pac ...
- ASP.NET Core 6框架揭秘实例演示[22]:如何承载你的后台服务[补充]
借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中.任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,A ...
- elasticsearch高亮之highlight原理
一.highlight简介 highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果: highlight功能通常包 ...
- 一比一还原axios源码(六)—— 配置化
上一章我们完成了拦截器的代码实现,这一章我们来看看配置化是如何实现的.首先,按照惯例我们来看看axios的文档是怎么说的: 首先我们可以可以通过axios上的defaults属性来配置api. 我们可 ...
- Mybatis——xml配置
注:该文档参考了 https://mybatis.org/mybatis-3/zh/configuration.html 狂神的视频:https://www.bilibili.com/video/BV ...