关联对象嵌套序列化 | 关联对象有多个时,参数serializers.PrimaryKeyRelatedField (many=true ) |
---|---|
主键名称 | serializers.PrimaryKeyRelatedField () |
关联模型类对象 | BookInfoSerializer () |
关联模型类返回的字符串 | serializers.StringRelatedField() |
补充校验
- validators:针对指定序列化器字段添加validators选项参数补充校验
def about_django(value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
btitle = serializers.CharField(label='名称', max_length=20, validators=[about_django])
- def validate_字段名(),校验单个字段
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
...
def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value
- def validate(),校验多个字段
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
...
def validate(self, attrs):
bread = attrs['bread']
bcomment = attrs['bcomment']
if bread < bcomment:
raise serializers.ValidationError('阅读量小于评论量')
return attrs
data = {'btitle': 'Django入门', 'bpub_date': '2019-06-01', 'bread': 10, 'bcomment': 20}
serializer = BookInfoSerializer(data=data)
serializer.is_valid() # 返回False会调用上边validate方法
数据保存
校验成功后,序列化器对象.save()
save方法内部:会调用序列化器类的create或update方法,create新增数据,update更新数据
视图
APIView:View
区别 | APIView | View |
---|---|---|
请求对象 | Request对象:1:request.data 2:request.query_params | HttpRequest对象:1:POST body FILES json.loads(request.body.decode()) 2:request.GET |
响应对象 | Response响应数据会根据客户端请求头Accpet自动转换为对应的格式进行返回 | HttpRequest对象 |
其他功能 | 认证、权限、限流 | HttpRequest对象 |
异常处理 | 自动处理任何APIException的子异常、http404 /raise http404会自动返回一个response | HttpRequest对象 |
GenericAPIView
class BookListView(GenericAPIView):
# 指定视图所使用的序列化器类
serializer_class = BookInfoSerializer
# 指定视图所使用的查询集
queryset = BookInfo.objects.all()
get_serializer_class: 获取指定的序列化器类
get_serializer: 创建指定序列化器类的对象
get_queryset: 获取指定的查询集
get_object:从指定的查询集查询一个对象进行返回,默认根据url地址提取的pk进行查询
注意:
- 使用get_serializer_class和get_serializer之前必须先指定serializer_class属性
- 使用get_queryset和get_object必须先指定queryset属性
GenericAPIView和APIView的区别:继承自APIView
- 操作序列化器相关属性和方法
- 数据库查询相关属性和方法
- 过滤、排序、分页
Mixin扩展类**
继承object,不能单独使用,需要配合GenericAPIView来进行使用。
DRF框架提供了5个Mixin扩展类,封装5个通用代码流程。
- ListModelMixin
class ListModelMixin(object):
def list(self, request, *args, **kwargs):
"""封装获取一组数据的通用代码流程"""
query_set = self.get_queryset() # QuerySet:查询集
serializer = self.get_serializer(query_set, many=True)
return Response(serializer.data)
- CreateModelMixin
class CreateModelMixin(object):
def create(self, request, *args, **kwargs):
"""封装新增一条数据通用代码流程"""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save() # 调用序列化器类中的create
return Response(serializer.data, status=status.HTTP_201_CREATED)
- RetrieveModelMixin
class RetrieveModelMixin(object):
def retrieve(self, request, *args, **kwargs):
"""封装获取指定数据通用代码流程"""
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
- UpdateModelMixin
class UpdateModelMixin(object):
def update(self, request, *args, **kwargs):
"""封装修改指定数据通用代码流程"""
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save() # 调用序列化器类中的update
return Response(serializer.data)
- DestroyModelMixin
class DestroyModelMixin(object):
def destroy(self, request, *args, **kwargs):
"""封装删除指定数据的通用代码流程"""
instance = self.get_object()
instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)