2.Request,Response和序列化类

【一】不同编码格式的http请求

  • django视图类或视图函数的request
# 只针对post请求的urlencoded编码格式才有数据(<QueryDict:{"a":"a"}>)
request.POST
# 请求地址框中获得数据(<QueryDict:{"a":["a"]}>)
request.GET
	# 只取一个
    request.GET.get('key')
	# 回去全部
    request.GET.getlist('key')
# 获取地址栏的数据(/eg/?a=a)
request.get_full_path()
# 无论什么编码均能取到数据(b'{"a":"a"}')
request.body
# 获得请求方式
request.method

【二】新Request对象和Response

from rest_framework.views import APIView
from rest_framework.response import Response

class BookView(APIView):
    def get(self,request):
        return Response({'code':100,'msg':'ok'})
  • 继承APIView后,使用drf响应
  • 需要在settings内注册才能使用(rest_framework)

1)新Request

  • request请求对象:http请求的所有内容都会在这个对象内

  • 继承APIView后的request对象不再是之前的request对象

  • 新旧区别

    • 旧:django.core.handlers.wsgi.WSGIRequest

    • 新:rest_framework.request.Request

    • 用法区别不大

  • request.data

    • 可获取所有编码格式的请求体数据,均可当字典使用
    • urlencoded,form-data:是QueryDict对象
    • json:字典对象
  • request.FILES

    • 可获取前端传的文件
  • request.query_params

    • 请求地址框中获得数据,同request.GET

2)Response

  • 可在响应体内直接放字典、列表、字符串

  • 放状态码与响应头

    Response('ok',status=201,headers={'a':1})
    
  • Response的所有参数

    # 响应头,可传字典、列表、字符串
    data=None
    # http响应的状态码(drf封装了所有常量)
    status=None
    # 指定使用浏览器访问返回的模板,没写用默认模板
    template_name=None
    # 响应头
    headers=None
    # 异常
    exception=False
    # 响应编码格式(一般不改)
    content_type=None
    

【三】序列化类

1)作用

  • 序列化:后端从数据库获取对象,以json格式传给前端

  • 反序列化:前端传json格式字符串给后端,后端须保存到数据库

2)查询案例

  • models.py
class Student(models.Model):
    name = models.CharField(
        verbose_name='姓名',
        max_length=32
    )
    age = models.IntegerField(
        verbose_name='年龄'
    )
    sex = models.IntegerField(
        verbose_name='性别',
        choices=[(0, '保密'), (1, '男'), (2, '女')],
        default=0
    )
  • 新建serializers.py
from rest_framework import serializers

class StudentSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    age = serializers.IntegerField()
    sex = serializers.IntegerField()
  • views.py
from rest_framework.views import APIView
from App.serializers import StudentSerializer
from rest_framework.response import Response
from App.models import Student

class StudentView(APIView):
    # 多条查询
    def get(self, request):
        students = Student.objects.all()
        # 使用drf提供的序列化完成序列化
        # 多条需要写many=True
        serializer = StudentSerializer(instance=students, many=True)
        return Response(serializer.data)
    
class StudentDetailView(APIView):
    # 查询单条
    def get(self, request, pk):
        student = Student.objects.get(pk=pk)
        serializer = StudentSerializer(instance=student)
        return Response(serializer.data)

3)常用字段

字段 字段构造方式
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=)

4)常用字段参数

  • 选项参数
参数名称 作用
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页面时,显示的字段帮助提示信息

【四】反序列化--保存

1)添加与修改

  • serializers.py
class StudentSerializer(serializers.Serializer):
    # 写要序列化的字段
    id = serializers.IntegerField(required=False)
    name = serializers.CharField()
    age = serializers.IntegerField()
    sex = serializers.IntegerField(required=False, default=0)

    # 重新create方法
    def create(self, validated_data):
        student = Student.objects.create(**validated_data)
        return student

    # 重建update方法
    def update(self, instance, validated_data):
        for key in validated_data:
            # 等同于 instance.name = validated_data.get('name')...
            setattr(instance, key, validated_data.get(key))
        instance.save()
        return instance
  • views.py
from rest_framework.views import APIView
from App.serializers import StudentSerializer
from rest_framework.response import Response
from App.models import Student

class StudentView(APIView):
    # 添加
    def post(self, request):
        # 获取前端传入的数据
        serializer = StudentSerializer(data=request.data)
        # 反序列化校验,并保存
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
            # return Response('保存成功', status=200)
        else:
            return Response('保存失败', status=400)


class StudentDetailView(APIView):
    # 修改
    def put(self, request, pk):
        student_obj = Student.objects.get(pk=pk)
        # 获取要修改的数据,前端的数据
        serializer = StudentSerializer(instance=student_obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response('保存失败', status=400)
posted on 2024-08-01 10:38  晓雾-Mist  阅读(9)  评论(0编辑  收藏  举报