在 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 许可协议
CreateModelMixin
UpdateModelMixin
rest_framework/mixins.py
其他Mixin类(例如ListModelMixin
这些 mixin 类提供了模型上的所有基本
CRUD
操作。 您只需在通用视图中定义serializer_class
和queryset
即可执行所有这些操作。 DRF 将这些通用功能分离到单独的混合类中,以便它们可以在视图中 注入/混合,并在需要时使用。在
GenericAPIView
中,定义了get_serializer
方法。不同 mixin 类的组合以及GenericAPIView
类为我们提供了针对不同用例的 不同通用视图。然后其他通用视图继承相关的
mixin
以及GenericAPIView
。例如。
CreateAPIView
继承CreateModelMixin
连同GenericAPIView
提供create-only