Django 之DRF原理操作

1. 相关概念及特点

  DRF含义:
    Django Rest Framework 是基于Django框架,采用Restful设计模式,写出的组件模块

  整体流程:
    客户端向服务端发请求,服务端返回数据,通常Django通过表中查询的数据都是queryset,里面存放着大量的模型类 对象(查询出来的数据对象),返回时,根据客户端语言的不同,要序列化成不同的格式,客户端拿到数据反序列化.
    通常返回json或xml格式的数据.所有编程语言都能识别

  DRF特点:
    ● 提供序列化和反序列化操作,内置了序列化器Serializer
    ● 提供了丰富的类视图 , Mixin扩展类 简化视图编写
    ● 提供认证,权限,限流,过滤,分页,接口文档等等功能

描述本文内容实现功能:

  (1)操作主要针对DRF的get,post请求进行模拟操作,熟悉DRF简单操作原理

  (2)增加字段的校验,防止不可用字段写入数据库

    (3)DRF里面无需注释csrf中间件功能,防止跨网站修改数据

    

2.  整个项目的Django内容截图

  

3. 建立数据库及model

  【数据库连接】

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME':'drfdb01',
        'USER': 'root',  # 连接数据库的用户名
        'PASSWORD': 'REDHAT',  # 连接数据库的密码
        'HOST': '127.0.0.1',  # IP地址
        'POST': 3306,  # 端口号
    }
}

  【model】

from django.db import models

# Create your models here.
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="个性签名")

    ## 元类Meta,定义类的元素属性
    class Meta:
        ## 自定义表明
        db_table="tb_student"
        ## 自定义表的中文名(单数)
        verbose_name = "学生"
        ## 自定义表的中文名(复数)
        verbose_name_plural = "学生"

4.  建立url路由

from django.contrib import admin
from django.urls import path
from  app1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.StudentView.as_view()),
]

5. 建立视图

  

from django.shortcuts import render,HttpResponse,redirect

# from django.views import View
from app1.models import Student   ## 导入要进行测试的表
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
# Create your views here.

class StudentSerializer(serializers.Serializer):   ## 自定义序列化器
    name = serializers.CharField(max_length=100)
    sex = serializers.BooleanField(default=1)
    age = serializers.IntegerField()
    class_null = serializers.CharField(max_length=5)
    description = serializers.CharField(max_length=1000,required=False)  	# required=False 非必须字段,允许为空

class StudentView(APIView):
    def get(self, request):
        ## 1. 获取单条序列化方法[一个模型类对象]
        # data = Student.objects.get(pk=1)    ## 获取id=1的数据信息
        # ss = StudentSerializer(instance=data)   ## 进行序列化
        # res = ss.data      ## 序列化获取数据
        # return Response(res)   ## get返回客户端数据
     ## 测试结果 ''' postman数据如下: { "name": "lisi", "sex": true, "age": 14, "class_null": "2", "description": "www" } ''' ## 2. 多条数据的序列化方法[queryset] # data = Student.objects.all() # ss = StudentSerializer(instance=data,many=True) # res = ss.data # return Response(res) ''' postman返回数据 [ { "name": "lisi", "sex": true, "age": 14, "class_null": "2", "description": "www" }, { "name": "zhangsan", "sex": false, "age": 15, "class_null": "1", "description": "rrr" }, { "name": "wangwu", "sex": true, "age": 14, "class_null": "1", "description": "yy" } ] ''' ## 3. 可以额外序列化更多数据,通过context关键词指定 data = Student.objects.all() ss = StudentSerializer(instance=data,many=True,context={"aaabbb":234}) res = ss.context return Response(res)
## 测试结果 ''' postman 返回值: { "aaabbb": 234 } ''' def post(self, request): # print(request.GET, "<GET>") # print(request.POST, "<POST>") # print(request.data, "<DATA>") """ # 反序列化(收数据) # instance=(写要序列化的数据) data=(写要反序列化的数据) ss = StudentSerializer(data=request.data) # print(ss.data) # 检测数据是否校验成功 print(ss.is_valid()) # 获取错误的原因 print(ss.errors) # 获取正确数据 print(ss.validated_data) """ ss = StudentSerializer(data=request.data) ## 获取的到的数据进行反序列化 if ss.is_valid(): ## 检测数据是否校验成功 data = Student.objects.create(**ss.validated_data) ## 写入到数据库 **进行解包 ss2 = StudentSerializer(instance=data) ## 进行序列化返回postman验证写入成功 return Response(ss2.data) else: return Response(ss.errors) ## 获取错误的原因

      ## 测试结果 ''' postman数据返回: { "name": "laoliu", "sex": false, "age": 16, "class_null": "2", "description": "" } ''' # return Response({})

6. 测试

  (1)get操作如3小节postman内容

    (2)   post操作,通过postman

                 

    【数据库查看添加数据成功】

      

7. 增加字段校验

  在自定义序列化器里面增加如下:

class StudentSerializer(serializers.Serializer):   ## 自定义序列化器
## 对单个字段的 校验 validate_字段名 def validate_name(self,value): if value == "abc": raise serializers.ValidationError("不让起这个名字") return value

  ## 多个字段校验validate def validate(self, attrs): name = attrs["name"] class_null = attrs["class_null"] if len(name) > len(class_null): raise serializers.ValidationError("名字太长了") return attrs

8. 验证校验

  (1)检验1:往数据库写入数据,name:abc 为序列化器不用写入的字符,postman返回“不让起这个名字”

  

  (2)检验2:字段name长度不能比class_null字段长

  

   通过以上可以验证检验是生效的。

  

原文地址:https://www.cnblogs.com/NGU-PX/p/14266338.html