1.在linux中的虚拟环境的搭建,并创项目
1.将linux中的虚拟环境以及pip3更新一下
#指定清华源下载pip的包 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv #升级pip工具 pip3 install --upgrade pip
2.使用下面的命令就行虚拟环境的搭建
# mkvirtualenv drfdemo -p python3
3.在第二步完成之后,linux会自动就入虚拟环境中去,接下来按照需要的库。
# pip install django # pip install pymysql # pip install djangorestframework
4.在虚拟环境中执行命令创建项目
django-admin startproject drfdemo
5.运行pycharm,选择打开刚刚创建的工程。
6.apps的注册,
在**settings.py**的**INSTALLED_APPS**中添加'rest_framework'。
在setting中就行设置:
INSTALLED_APPS = [ ... 'rest_framework', ]
接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:
-
将请求的数据(如JSON格式)转换为模型类对象
-
-
7.使用命令行创建app,在setting中就行app的配置,
8.下面的步骤和之前的步骤是一样的,在数据库中就行创建数据库。
8.5 创建models模型。
class Student(models.Model): # 模型字段 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
记得在setting的同级目录中就行写上,即是在__init__中,
import pymysql
pymysql.install_as_MySQLdb()
9.在setting中配置数据库。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "drf_demo", 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': "123", } }
10.执行迁移命令。
python manage.py makemigrations
python manage.py migrate
注意:在执行数据的迁移命令的时候会出现2个常见的错误,这里不重复叙述。
# 注释掉 backends/mysql/base.py中的35和36行代码。
# backends/mysql/operations.py146行里面新增一个行代码:
query = query.encode()
2.1.上面的都完成之后,创建序列化器。# 这下面的步骤是体验DRf完成简写的过程,这里是在students的子应用中。
例如,在django项目中创建学生子应用。students中新建一个serializer.py用户保存该应用的序列化器,
创建一个StudentModelSerializer用于序列化与反序列化。
# 创建序列化器类,回头会在试图中被调用 class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = "__all__"
-
-
fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段
2.2编写视图函数
在students应用的views.py中创建视图StudentViewSet,这是一个视图集合。
from rest_framework.viewsets import ModelViewSet from .models import Student from .serializers import StudentModelSerializer # Create your views here. class StudentViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer
-
-
serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器
2.3自定义路由
在students应用的urls.py中定义路由信息。
from . import views from rest_framework.routers import DefaultRouter # 路由列表 urlpatterns = [] router = DefaultRouter() # 可以处理视图的路由器 router.register('student', views.StudentViewSet) # 向路由器中注册视图集 urlpatterns += router.urls # 将路由器中的所以路由信息追到到django的路由列表中
最后把students子应用中的路由文件加载到总路由文件中.
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path("drf/",include("students.urls")), ]
2.4运行测试
1.
修改完成之后点击PUT返回页面信息。
6)输入一个不存在的学生id,会出现下面的截图。
3.
3.1作用:
1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
接下来,为了方便演示序列化器的使用,我们先创建一个新的子应用ser。
之前我们已经有了一个models类Student,
我们想为这个模型类提供一个序列化器,可以定义如下:
from rest_framework import serializers # 声明序列化器,所有的序列化器都要直接或者间接继承于 Serializer # 其中,ModelSerializer是Serializer的子类,ModelSerializer在Serializer的基础上进行了代码简化 class StudentSerializer(serializers.Serializer): """学生信息序列化器""" # 1. 需要进行数据转换的字段 id = serializers.IntegerField() name = serializers.CharField() age = serializers.IntegerField() sex = serializers.BooleanField() description = serializers.CharField() # 2. 如果序列化器集成的是ModelSerializer,则需要声明调用的模型信息 # 3. 验证代码 # 4. 编写添加和更新模型的代码
常用字段类型:参考其他的博文。如陈涛老师,
3.2
定义好Serializer类后,就可以创建Serializer对象了。
Serializer的构造方法为
Serializer(instance=None, data=empty, **kwarg)
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = AccountSerializer(account, context={'request': request})
1. 使用序列化器的时候一定要注意,序列化器声明了以后,不会自动执行,需要我们在视图中进行调用才可以。 2. 序列化器无法直接接收数据,需要我们在视图中创建序列化器对象时把使用的数据传递过来。 3. 序列化器的字段声明类似于我们前面使用过的表单系统。 4. 开发restful api时,序列化器会帮我们把模型数据转换成字典. 5. drf提供的视图会帮我们把字典转换成json,或者把客户端发送过来的数据转换字典.
3.3
from students.models import Student student = Student.objects.get(id=3)
2) 构造序列化器对象,把刚刚写的StudentSerializer导入,
from .serializers import StudentSerializer serializer = StudentSerializer(instance=student)
3)获取序列化数据
通过data属性可以获取序列化后的数据
class Student1View(View): """使用序列化就行数据的序列化操作""" """序列化转换一条数据{模型转换成字典}""" def get(self, request, pk): student_obj = Student.objects.get(pk=pk) # 转换数据类型 # 1.实例化序列化器类 """ StudentSerializer(instance=模型对象或者模型列表,客户端提交的数据,额外要传递到序列化器中使用的数据) """ serializer = StudentSerializer(instance=student_obj) # 查看序列化器的转换结果 print(serializer.data, type(serializer.data)) # {'id': 1, 'name': 'alex', 'age': 28, 'sex': False, # 'description': '大家收看京东卡'} <class 'rest_framework.utils.serializer_helpers.ReturnDict'> return JsonResponse(serializer.data)
在原来的视图函数中定义使用即可。
class Student2View(View): """ 序列化器转换多条数据模型转换成字典 """ def get(self, request): student_list = Student.objects.all() # many = True 表示本次序列化器转换如果有多个模型对象 则必须声明Many = True serializer = StudentSerializer(instance=student_list, many=True) print(serializer.data, type(serializer.data)) # [OrderedDict([('id', 1), ('name', 'alex'), ('age', 28), ('sex', False), ('description', '大家收看京东卡')]), # OrderedDict([('id', 2), ('name', 'longer'), ('age', 17), ('sex', False), ('description', '打电话涉及到很深刻的骄傲')])] # <class 'rest_framework.utils.serializer_helpers.ReturnList'> # return HttpResponse(serializer.data) return JsonResponse(serializer.data, safe=False)