You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:17:19