Django REST Framework 中的 self.get_serializer 方法来自哪里?

新手上路,请多包涵

DRF 源代码 中,有一个 get_serializer 方法。它不是从对象继承的,也不是 CreateModelMixin 类中的方法。这个方法从何而来?

 serializer = self.get_serializer(data=request.data)

这是上下文的较大代码块。

 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 {}

有一些 SO 帖子也使用了这种方法。像 这个这个,还有 这个。但我仍然无法弄清楚实施在哪里。

原文由 k-mad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

CreateModelMixin UpdateModelMixin rest_framework/mixins.py 其他Mixin类(例如 ListModelMixin

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

在 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)

然后其他通用视图继承相关的 mixin 以及 GenericAPIView

例如。 CreateAPIView 继承 CreateModelMixin 连同 GenericAPIView 提供 create-only

 # rest_framework/generics.py
class CreateAPIView(mixins.CreateModelMixin,
                    GenericAPIView):
    ...

原文由 Rahul Gupta 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您了解类继承(但不建议您不了解),它会有所帮助。

CreateModelMixin 将由基于类的视图使用,例如:

 class YourViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

get_serializer 是一种通过 GenericViewSet 可用的方法(尽管可能还有其他视图类也可用)。

所以,基本上,如果您要使用 CreateModelMixin 只有 get_serializer 将不可用。 (无论如何你可能不会那样做)。只是因为你从除了 CreateModelMixin 之外的另一个类继承, create get_serializer 在执行—21f279d64696b4f944f5115cb-95efecb-时可用。

我可以举一个简单的例子来说明正在发生的事情。这只是为了更简单地概述正在发生的事情。

免责声明:您可能要记住我是一名初级开发人员,所以这可能不是最 Pythonic 的代码:P。

 class MyMixin:
    def create(self):
        serializer = self.get_serializer()
        return serializer

class FakeView:
    def get_serializer(self):
        return "Sadly I am just a string, but I could've been a serializer."

class MyFakeView(MyMixin, FakeView):
    pass

view = MyFakeView()

serializer = view.create()

print(serializer)

执行这个会告诉你:

Sadly I am just a string, but I could've been a serializer.

如果您要定义 MyFakeView ,如下所示,

 class MyFakeView(MyMixin):
    pass

您会收到以下错误:

AttributeError: 'MyFakeView' object has no attribute 'get_serializer'

原文由 Rik Schoonbeek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题