django-rest-framerwork序列化器如何获取用户ID

时间:2017-07-17 08:56:17

标签: django django-rest-framework

这样的模型:

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

和序列化器:

class AlbumSerializers(serializers.ModelSerializer):
    count=serializers.SerializerMethodField()
    class Meta:
        module=Album
        fields=('__all__')

我只想知道如何在序列化程序中获取user.id

3 个答案:

答案 0 :(得分:1)

Django REST框架的序列化程序使用上下文来保存这些东西。它用于在使用HyperlinkedSerializers时查找关联的主机名并记录here

默认情况下,通用视图会添加当前请求,这意味着您可以执行以下操作:

class AlbumSerializers(serializers.ModelSerializer):

    count=serializers.SerializerMethodField()

    class Meta:
        module=Album
        fields=('__all__')

    def get_count(self,obj):
        # Provided the user is logged:
        user_id = self.context['request'].user.id
        # Now do whatever with user_id
        return

答案 1 :(得分:0)

首先要注意的是,您不能访问views以外的请求。如果要访问请求,则必须传递上下文 explicilty,因为django rest框架隐式不会将请求传递给序列化程序。

class MyAPIView(APIView):
    def get(self, request):
    query_set = MyObjects.objects.all()

    serializer = MySerializer(query_set,
                              context={'request': request},
                              many=True)
    return Response(serializer.data)

注意:当您使用APIView或任何其他基类视图时就是这种情况。但是如果ViewSets您不必重写方法,Django Rest Framework将自动将request发送到Serializer类。我希望它能清除这个概念!

答案 2 :(得分:0)

Serializer:

class AlbumSerializers(serializers.ModelSerializer):

    count=serializers.SerializerMethodField()

    class Meta:
        module=Album
        fields=('__all__')

    def get_count(self,obj):
        request = self.context.get("request")
        user_id = request.user.id

        return