Restframework
Restframework 简介
- drf是一个能快速提供API接口,方便变成的框架。遵循restful规范,常用于前后端分离的应用模式中,通常将后端开发的每个视图都称之为一个接口,前端通过访问接口来对数据进行增删改查。
- 特点
- DRF提供了定义序列化器Serializer的方法,可以快速的根据ORM 或者其他库自动序列化/反序列化
- 提供了丰富的类视图和Minxin扩展类,监护了视图的编写
- 丰富的定制层级: 函数,类视图等,满足各种需求
- 丰富的权限验证和身份验证支持,以及内置系统和较好的APIweb页面, 具有超强的可扩展性和从丰富的的插件。
安装
- 通过
pip install djangorestframework 或git clone https://github.com/encode/django-rest-framework
命令安装 - 并在setting.py文件配置, 分页配置
INSTALLED_APPS = [ 'rest_framework', ] # 分页 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser', ], 'PAGE_SIZE': 10 }
序列化
-
Serializers是一个REST框架提供的一个序列化组件类,提供了一种通用的方法来控制响应的输出以及ModelSerializer类,他为创建处理模型实例和查询集的序列化程序提供了有用的快捷键方式。它的工作方式是和Django中的form和modelForm是类似的,都是对获取的字段进行验证,并进行序列化,获得需要的数据格式(json或xml),同时也提供了反序列化程序。
-
Serializers分为两种,一种是继承自rest_framework.serializers.Serializer类,类是以form,;另一种是继承自继承自rest_framework.serializers.ModelSerializer类,类似于modelForm。
-
ModelSerializer类
- ModelSerializer的使用需要依赖与模型,常用于编写api
- 功能
-
序列化queryset数据
-
反序列化json数据,将反序列化后的数据转换成model对象
-
反序列化的时,可以对数据进行校验,若数据等合法可以进行save()方法或者进行post,get请求操作,不合法,将返回错误。
from rest_framework import serializers class UserInfo(serializers.ModelSerializer): # 多对多时添加many=true username = serializers.CharField(source='hh', read_only=False,queryset=Book.objects.all()) # 自定义字段 '''创建序列化器''' class Meta: model = Book # 表示对应的模型 fields = '__all__' # 输出序列化全部字段 # fields = ['id', 'title'] # 自定义输出的字段 # exclude = ['id', 'title'] # 排除某些输出字段 # depth = 1 # depth代表显示嵌套关系的第几层, 并且使用depth时引用外键的字段,会自动变为只读 # 反序列化 class User(serializers.ModelSerializer): model = Book fields = ('id') # 表示参与反序列化字段 extra_kwargs = { # 表示参与反序列化字段的各种约束 'username': { 'required': True, 'min_length': 3, 'read_only': True, # 只读 'write_only': True # 只写 } }
-
-
Serializer类
-
Serializer的使用可以不依赖于模型,直接编写serializer文件。
-
它也是rest_framework中最简单的序列化类,封装也最低,但却非常灵活,实现这个类需要重写create和update两个方法。
-
create()方法对应POST请求
-
update()方法对应PUT/PATCH来访问API,这取决于数据库是否需要更新。
from rest_framework import serializers 模型类 class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = models.DateField(verbose_name='发布日期', null=True) bread = models.IntegerField(default=0, verbose_name='阅读量') bcomment = models.IntegerField(default=0, verbose_name='评论量') image = models.ImageField(upload_to='booktest', verbose_name='图片', null=True 序列化器 class BookInfoSerializer(serializers.Serializer): """图书数据序列化器""" id = serializers.IntegerField(label='ID', read_only=True) btitle = serializers.CharField(label='名称', max_length=20) bpub_date = serializers.DateField(label='发布日期', required=False) bread = serializers.IntegerField(label='阅读量', required=False) bcomment = serializers.IntegerField(label='评论量', required=False) image = serializers.ImageField(label='图片', required=False) 视图中使用 from django.http import HttpResponse from books.models import BookInfo,HeroInfo from .serializers import BookInfoSerializers,HeroInfoSerializers def books(request): # # 单一对象的序列化 # book = BookInfo.objects.get(pk=1) # book_serializers = BookInfoSerializers(book) # book_dict = book_serializers.data # print(book_dict) # 多对象的序列化 # book_dict= BookInfoSerializers(BookInfo.objects.all(),many=True).data # print(book_dict)
-