Django Rest 框架中 self.get_serializer 和 Serializer 对象有什么区别?

Moo*_*oon 5 python django django-rest-framework

目前我已经开始学习 Django Rest 框架,并且遇到了以下用于获取序列化器对象的代码。

1)serializer = self.get_serializer(queryset, many=True)
2)serializer = MyDataTypeSerializer(queryset, many=True)
Run Code Online (Sandbox Code Playgroud)

通过使用上述两种方法,我可以获得几乎相同类型的输出,因此我试图找到它们之间的差异,但找不到任何差异。

我在我的视图集中同样使用了上述方法。

class MyDataTypeViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    serializer_class = MyDataTypeSerializer
    permission_classes = [IsAuthenticated]
    queryset = MyDataType.objects.all()
    def get_queryset(self):
        return self.queryset.filter(user_id=self.request.user.id).order_by('-created_at')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            serializer = self.get_paginated_response(serializer.data)
            return return_success(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        #serializer = MyDataTypeSerializer(queryset, many=True)
        return return_success(serializer.data)
Run Code Online (Sandbox Code Playgroud)

如果有人知道,请告诉我这两种方法之间的区别以及如何决定在哪种情况下使用哪种方法。

谢谢,

AKX*_*AKX 5

get_serializer()还负责传递视图集的序列化器上下文,并调用get_serializer_class()以确定要使用哪个序列化器类。

除非该函数已根据 Andrew 在评论中链接的默认视图集进行了自定义,并且serializer_class = MyDataTypeSerializer已设置,

serializer = self.get_serializer(queryset, many=True)
Run Code Online (Sandbox Code Playgroud)

完全等于

serializer = MyDataTypeSerializer(
  queryset,
  many=True,
  context=self.get_serializer_context(),
)
Run Code Online (Sandbox Code Playgroud)