Django Rest Framwork让用户进入序列化器

时间:2016-06-03 11:32:48

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

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

例如我有这个序列化器:

serializers.py

class ClientSearchSerializer(serializers.ModelSerializer):

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

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

2 个答案:

答案 0 :(得分:3)

CurrentUserDefault应该适合你。

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

请注意:

  

为了使用它,'request'必须作为一部分提供   实例化序列化程序时的上下文字典。

如果您正在使用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'
    )

答案 1 :(得分:1)

正如已经回答的那样,

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