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

How to add user in perform_create viewset (django rest framework)?

我想做一个"comment"table。在 table 上,将有一个包含创建评论的 user_id 的字段。与评论 table 相关的用户来自 Django 默认用户模型。这是评论模型:

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 的 header 和数据。

Header:

授权:Bearer {jwt token}

Content-Type: application/json

body:

{ "content": "This is the comment" }


但是我得到了这样的回复:

{ "user": [ "This field is required." ] }


如何修复序列化程序,使其从令牌 (request.user) 中检索用户?

这是因为 user 字段不是 read only field 。所以你必须这样做。

这个 DRF 文档 -- Specifying read only fields 描述得很好

在您的情况下,在序列化程序的 Meta class 中指定 read_only_fields 将解决问题:)

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