Python类如何调用未定义/继承的类方法?以DRF CreateModelMixin为例
Django REST Framework中CreateModelMixin的get_serializer方法生效原因解析
我正在阅读Django REST Framework的mixin.py源码,以CreateModelMixin类为例,代码如下:
from rest_framework import status from rest_framework.response import Response from rest_framework.settings import api_settings class CreateModelMixin: """ Create a model instance. """ def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def perform_create(self, serializer): serializer.save() def get_success_headers(self, data): try: return {'Location': str(data[api_settings.URL_FIELD_NAME])} except (TypeError, KeyError): return {}
我理解self.perform_create()和self.get_success_headers()是该类内定义的方法,但self.get_serializer(data=request.data)为何能够生效?目前我的认知:
- CreateModelMixin未继承任何类;
- get_serializer()未从其他文件导入;
- get_serializer()未在该类内定义。
这是因为Mixin类的设计初衷就是和其他类混合继承使用,而非单独实例化。
在Django REST Framework中,CreateModelMixin通常会和GenericAPIView(或其子类)一起被视图类继承。get_serializer()方法正是在GenericAPIView中实现的——它的作用是根据视图类中配置的serializer_class属性,创建并返回对应的序列化器实例。
举个实际的例子,日常编写DRF视图时的典型写法:
from rest_framework.generics import CreateAPIView from .models import YourModel from .serializers import YourModelSerializer class YourCreateView(CreateAPIView): queryset = YourModel.objects.all() serializer_class = YourModelSerializer
这里的CreateAPIView就是同时继承了CreateModelMixin和GenericAPIView的组合类,所以当CreateModelMixin的create方法调用self.get_serializer()时,实际调用的是GenericAPIView中实现的方法。
简言之,Mixin类只负责提供某一部分功能逻辑,依赖其他父类来提供必要的基础方法,这种设计让代码可以灵活复用不同的功能模块。
内容的提问来源于stack exchange,提问作者Zheng
相关产品推荐
相关产品推荐

