【问题标题】: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