self.get_serializer方法来自Django REST Framework中的哪个位置?

k-m*_*mad 10 python django-rest-framework

DRF源代码中,有一个get_serializer方法.它不是从object继承的,它不是CreateModelMixin类中的方法.这种方法来自哪里?

serializer = self.get_serializer(data=request.data)
Run Code Online (Sandbox Code Playgroud)

这是上下文的大块代码.

from __future__ import unicode_literals

from rest_framework import status
from rest_framework.response import Response
from rest_framework.settings import api_settings


class CreateModelMixin(object):
    """
    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': data[api_settings.URL_FIELD_NAME]}
        except (TypeError, KeyError):
            return {}
Run Code Online (Sandbox Code Playgroud)

有一些SO帖子也使用这种方法.像这样,这个,这个.但我仍然无法弄清楚实施的位置.

Rah*_*pta 12

CreateModelMixin以及所有其他mixin类(例如ListModelMixin,UpdateModelMixin等)在rest_framework/mixins.py文件中定义 .

这些mixin类提供CRUD模型的所有基本操作.您只需要在通用视图中定义一个serializer_classqueryset执行所有这些操作.DRF已在单独的mixin类中分离出这些常用功能,以便可以在视图中注入/混合它们,并在需要时使用.

在DRF源代码中,有一种get_serializer方法.它不是从对象继承的,它不是CreateModelMixin 类中的方法.这种方法来自哪里?

GenericAPIView,get_serializer方法被定义.不同mixin类和GenericAPIView类的组合为不同的用例提供了不同的通用视图.

class GenericAPIView(views.APIView):
    """
    Base class for all other generic views.
    """

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

其他通用视图则继承相关mixin沿GenericAPIView.

例如. CreateAPIView继承CreateModelMixin以及GenericAPIView提供create-only端点.

# rest_framework/generics.py
class CreateAPIView(mixins.CreateModelMixin,
                    GenericAPIView):
    ...
Run Code Online (Sandbox Code Playgroud)

  • 我想我越来越接近理解了.我查看了`GenericAPIView`代码并且它具有`get_serializer`的实现.要使用`CreateModelMixin`,我还需要使用`GenericAPIView`.`class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):`有效.`class CreateAPIView(mixins.CreateModelMixin):`不起作用,因为`CreateModelMixin`依赖于`GenericAPIView`来实现`get_serializer`方法.这必须是你的意思__其他通用视图然后继承相关mixin和GenericAPIView .__ (2认同)