2015-01-14 58 views
22

是否可以在模型序列化程序中获取当前用户?我想这样做,而不必从泛型中分离出来,因为这是一个必须完成的简单任务。在Model Serializer中获取当前用户

我的模型:

class Activity(models.Model): 
    number = models.PositiveIntegerField(
     blank=True, null=True, help_text="Activity number. For record keeping only.") 
    instructions = models.TextField() 
    difficulty = models.ForeignKey(Difficulty) 
    categories = models.ManyToManyField(Category) 
    boosters = models.ManyToManyField(Booster) 

    class Meta(): 
     verbose_name_plural = "Activities" 

我的串行:

class ActivitySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Activity 

而我的观点:

class ActivityDetail(generics.RetrieveUpdateDestroyAPIView): 

    queryset = Activity.objects.all() 
    serializer_class = ActivityDetailSerializer 

我怎样才能模型返回,另外还有场user这样我的回复如下所示:

{ 
    "id": 1, 
    "difficulty": 1, 
    "categories": [ 
     1 
    ], 
    "boosters": [ 
     1 
    ], 
    "current_user": 1 //Current authenticated user here 
} 

回答

30

我通过Djangorestframework源代码找到答案。

class ActivitySerializer(serializers.ModelSerializer): 

    # Create a custom method field 
    current_user = serializers.SerializerMethodField('_user') 

    # Use this method for the custom field 
    def _user(self, obj): 
     user = self.context['request'].user 
     return user 

    class Meta: 
     model = Activity 
     # Add our custom method to the fields of the serializer 
     fields = ('id','current_user') 

的关键是这样一个事实:ModelSerializer内定义的方法访问他们自己的上下文,其总是包括请求(包含当一个认证的用户)。由于我的权限仅适用于经过身份验证的用户,因此应始终有一些东西在这里。

这也可以在其他内置的djangorestframework序列化器中完成。

+0

你如何访问该变量?我有类似的设置,但在create()方法中,我似乎无法访问该变量。它也不在request.POST中。 – Craig

+0

我使用上面的代码,但给出以下错误 文件“/Users/abc/abc/Django/Work/abc/abc/src/MadhaparGamApps/serializers/newsfeedSerializer.py”,第21行,在_user user = self.context ['request']。用户 KeyError:'request' –

+1

对于每个获取请求的人来说KeyError:你可以通过使用请求对象从视图初始化序列化程序,如下所示:serializer = serializers.RandomSerializer(data = request.data,context = {'request':request}) 来源:http://www.django-rest-framework.org/api-guide/serializers/#saving-instances –

13

将上下文传递到REST框架中的序列化程序,该框架默认包含请求。所以你可以在你的序列化程序中使用self.context['request'].user