【问题标题】:Django Rest Framwork get user in serializerDjango Rest Framework 在序列化程序中获取用户
【发布时间】:2016-10-03 10:56:42
【问题描述】:

我可以在我的序列化程序中获取用户吗?

例如我有这个序列化器:

serializers.py

class ClientSearchSerializer(serializers.ModelSerializer):

    client = serializers.SlugRelatedField(
        many=False,
        queryset=Client.objects.filter(user=????),
        slug_field='id'
    )

我可以从 SlugRelatedField 中过滤我的查询集吗?

【问题讨论】:

    标签: python django api serialization django-rest-framework


    【解决方案1】:

    CurrentUserDefault 应该适合你。

    文档:http://www.django-rest-framework.org/api-guide/validators/#currentuserdefault

    请注意:

    为了使用它,“请求”必须作为 实例化序列化器时的上下文字典。

    如果您使用ModelViewSet 或任何采用serializer_class 并自动为您初始化它的视图/视图集,那么您不必担心这一点。

    代码示例:

    from rest_framework.fields import CurrentUserDefault
    
    class ClientSearchSerializer(serializers.ModelSerializer):
    
        client = serializers.SlugRelatedField(
            many=False,
            queryset=Client.objects.filter(user=CurrentUserDefault()),
            slug_field='id'
        )
    

    【讨论】:

      【解决方案2】:

      CurrentUserDefault() 是获得用户的好方法,正如已回答的那样。另一种选择是返回一个函数,该函数在视图的get_serializer_class 方法中返回一个序列化程序类。这样你就可以提供self.request.user 作为函数的参数。

      rest_views.py:

      class DetailView(generics.RetrieveAPIView):
      
          def get_serializer_class(self):
              return get_client_search_serializer(user=self.request.user)
      
          ...
      

      serializers.py:

      def get_client_search_serializer(user):
          class ClientSearchSerializer(serializers.ModelSerializer):
      
              client = serializers.SlugRelatedField(
                  many=False,
                  queryset=Client.objects.filter(user=user),
                  slug_field='id'
              )
      
          return ClientSearchSerializer
      

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 2021-11-21
        • 2015-07-24
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 2016-12-18
        • 2017-06-04
        相关资源
        最近更新 更多