如何在perform_create视图集(django rest框架)中添加用户?

时间:2019-02-01 15:49:42

标签: django-rest-framework django-serializer django-rest-viewsets django-rest-framework-jwt

我想做一个“评论”表。在表上,将包含一个包含user_id的字段,该字段创建了注释。与注释表相关的用户来自Django默认用户模型。这是Comment模型:

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

这是评论序列化器:

class CommentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Comment
        fields = '__all__'

这是用于创建新评论的视图集:

class CommentViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    permission_classes = (IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

我还将用户与django rest jwt集成在一起以进行授权。这是我发送到API的标题和数据。

标题:

授权:不记名{jwt令牌}

内容类型:application / json

正文:

{     “ content”:“这是评论” }


但是我得到这个回应:

{     “用户”:[         “这是必填栏。”     ] }


如何修复序列化程序,以便它将从令牌(request.user)中检索用户?

1 个答案:

答案 0 :(得分:1)

这是因为在 user 字段是不是一个的 read only field 即可。所以,你必须让它如此。

此DRF文档-Specifying read only fields对其进行了很好的描述

在你的情况下,指定的 read_only_fields 在串行器的元类将解决的问题:)

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'
        read_only_fields = ('user',) # change is here <<<