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)