DRF补充校验、APIView、GenericAPIView、Mixin扩展类

关联对象嵌套序列化关联对象有多个时,参数serializers.PrimaryKeyRelatedField (many=true )
主键名称serializers.PrimaryKeyRelatedField ()
关联模型类对象BookInfoSerializer ()
关联模型类返回的字符串serializers.StringRelatedField()
补充校验
  1. 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])
  1. def validate_字段名(),校验单个字段
class BookInfoSerializer(serializers.Serializer):
    """图书数据序列化器"""
    ...

    def validate_btitle(self, value):
        if 'django' not in value.lower():
            raise serializers.ValidationError("图书不是关于Django的")
        return value
  1. 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
区别APIViewView
请求对象Request对象:1:request.data 2:request.query_paramsHttpRequest对象:1:POST body FILES json.loads(request.body.decode()) 2:request.GET
响应对象Response响应数据会根据客户端请求头Accpet自动转换为对应的格式进行返回HttpRequest对象
其他功能认证、权限、限流HttpRequest对象
异常处理自动处理任何APIException的子异常、http404 /raise http404会自动返回一个responseHttpRequest对象
GenericAPIView
class BookListView(GenericAPIView):
		# 指定视图所使用的序列化器类
		serializer_class = BookInfoSerializer
		# 指定视图所使用的查询集
		queryset = BookInfo.objects.all()

get_serializer_class: 获取指定的序列化器类

get_serializer: 创建指定序列化器类的对象

get_queryset: 获取指定的查询集

get_object:从指定的查询集查询一个对象进行返回,默认根据url地址提取的pk进行查询

注意:

  • 使用get_serializer_classget_serializer之前必须先指定serializer_class属性
  • 使用get_querysetget_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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值