前言
DRF 框架,全称为 Django Rest Framework,是 Django 内置模块的扩展,用于创建标准化 RESTful API;它利用 ORM 映射数据库,并自定义序列化数据进行返回,多用于前后端分离项目。
Django与DRF的区别:
django:将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果。
DRF:DRF是Django的超集(就是前者有的东西是后者没有的东西),去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。
序列化器的了解
序列化器的作用
序列化:序列化器会把模型对象转换成字典,经过response以后变成json字符串
反序列化:把客户端发送过来的数据,转换成request字典,序列化器可以把字典转成模型,再此过程中可以实现数据检验功能
模型常用字段
创建模型时需要使用一些字段,通过ORM将模型对象自动持久化到关系数据库中。一些常用字段放在最后查看
序列化器的使用
1. 环境搭配
安装所需库
pip install django
pip install djangorestframework
创建项目
mkdir django-drf #放置代码的文件夹
cd mkdir
django-admin startproject mysite #创建项目
这样我们就创建好了一个django项目
我们可以看到创建了如下目录和文件
mysite/ #根目录,项目的容器
manage.py #django项目管理命令工具
mysite/ #项目
__init__.py #空文件,旨在认为是一个包
settings.py #项目配置文件
urls.py #URL声明
asgi.py #ASGI
wsgi.py #WSGI
2. 创建模型以及数据迁移
OK,经过上面,我们以及创建了一个基本的Django项目,接下来就是项目程序编写,我们先创建应用,一般一个应用用于解决一个实际需求,现在创建一个名为app的应用来解决的我们初次学习djanog这个需求
python manage.py startapp drf #需要在mysite下输入,创建一个名为drf的应用
创建好app以后,我们要将这个包添加到setting中才能使用,并且配置rest_framework
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'drf'
]
创建一个名为student的数据模型
# mysite/drf/models.py
class Student(models.Model):
id = models.AutoField(primary_key=True)#主键
name = models.CharField(max_length=100,verbose_name='学生姓名')
sex = models.BooleanField(default=1,verbose_name="性别")
age = models.IntegerField(verbose_name="年龄")
class_null = models.CharField(max_length=5,verbose_name="班级编号")
description = models.TextField(max_length=1000,verbose_name="个性签名")
class Meta:
db_table="tb_student"
verbose_name = "学生"
verbose_name_plural = verbose_name
进行数据迁移
python manage.py makemigrations #数据迁移
python manage.py migrate #创建表结构
3. 序列化模型
# mysite/drf/serializers.py 创建一个serializers文件
from rest_framework import serializers
from .models import Student
class StudentSerializers(serializers.ModelSerializer):
"""
使用Serializer需要自己定义字段
ModelSerializer默认直接导入model字段
"""
class Meta:
# model指明该序列化器处理的数据字段从模型类Student参考生成
model = Student
# fields指明该序列化器包含模型类中的那些字段,‘all’指明包含所有字段
# 需要序列化的字段,可自由选择
fields = "__all__"
4. 编写视图
# mysite/drf/voews.py
from .models import Student
from rest_framework.viewsets import ModelViewSet
from .serializers import StudentSerializers
# Create your views here.
class StudentModelViewSet(ModelViewSet):
"学生模型视图"
#指明该视图在进行序列化在查询数据时使用的查询集
queryset = Student.objects.all()
#serializer_class指明该视图在进行序列化或反序列化时使用的序列化器
serializer_class = StudentSerializers
5. 编写路由
# mysite/drf/urls.py
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()#可以处理视图的路由器
router.register("student",views.StudentModelViewSet,basename="student")#向视图中注册视图集
#路由列表
urlpatterns = []+router.urls#将路由器中的所有路由追加到django的路由列表中
到这里,我们就把django drf的基本流程走了一遍,通过命令行运行后打开浏览器访问该网址
python manage.py runserver
结束
模型常用字段
字段 | 字段构造方式 |
---|---|
BooleanField | BooleanField() |
NullBooleanField | NullBooleanField() |
CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |
EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |
RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |
SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+ |
URLField | URLField(max_length=200, min_length=None, allow_blank=False) |
UUIDField | UUIDField(format=‘hex_verbose’) format: 1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a" |
IPAddressField | IPAddressField(protocol=‘both’, unpack_ipv4=False, **options) |
IntegerField | IntegerField(max_value=None, min_value=None) |
FloatField | FloatField(max_value=None, min_value=None) |
DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置 |
DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |
DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
DurationField | DurationField() |
ChoiceField | ChoiceField(choices) choices与Django的用法相同 |
MultipleChoiceField | MultipleChoiceField(choices) |
FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ListField | ListField(child=, min_length=None, max_length=None) |
DictField | DictField(child=) |
选项参数:
参数名称 | 作用 |
---|---|
max_length | 最大长度 |
min_lenght | 最小长度 |
allow_blank | 是否允许为空 |
trim_whitespace | 是否截断空白字符 |
max_value | 最小值 |
min_value | 最大值 |
通用参数:
参数名称 | 说明 |
---|---|
read_only | 表明该字段仅用于序列化输出,默认False |
write_only | 表明该字段仅用于反序列化输入,默认False |
required | 表明该字段在反序列化时必须输入,默认True |
default | 反序列化时使用的默认值 |
allow_null | 表明该字段是否允许传入None,默认False |
validators | 该字段使用的验证器 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展示API页面时,显示的字段名称 |
help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |