【问题标题】:What is difference between self.get_serializer and Serializer object in Django rest framework?Django rest 框架中的 self.get_serializer 和 Serializer 对象有什么区别?
【发布时间】:2020-05-14 12:08:21
【问题描述】:

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

1)serializer = self.get_serializer(queryset, many=True)
2)serializer = MyDataTypeSerializer(queryset, many=True)

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

我在我的视图中也使用了上述方法。

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)

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

谢谢,

【问题讨论】:

  • 您是否费心查看 get_serializer() 的代码? github.com/encode/django-rest-framework/blob/master/… 。它只是获取课程,然后通过您的论点。它的 3 行。
  • 但是我想知道这两种方法的区别。我应该什么时候使用哪一个?
  • 你没有显示你想在哪里使用它们。一种是视图的基本方法,框架默认使用。另一个可以在需要时手动使用。您通常不需要在视图集中直接调用任何一个。第一个只是构造上下文对象并调用您的#2 行。
  • 我已经编辑了我在项目中如何使用它的问题。

标签: python django django-rest-framework


【解决方案1】:

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

除非该功能已从the viewset default as linked by Andrew in the comments 定制,并且已设置serializer_class = MyDataTypeSerializer

serializer = self.get_serializer(queryset, many=True)

完全等价于

serializer = MyDataTypeSerializer(
  queryset,
  many=True,
  context=self.get_serializer_context(),
)

【讨论】:

  • 所以我认为,在上述情况下,使用 self.get_serializer 比使用 MyDataTypeSerializer 实例更可取。对吗?
  • 是的,这就是我要使用的。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多