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

Kri*_*adi 0 django-serializer django-rest-framework django-rest-viewsets django-rest-framework-jwt

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

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

这是评论序列化器:

class CommentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Comment
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

标题:

授权:持有者{jwt token}

内容类型:application/json

身体:

{ "content": "这是评论" }


但我得到这样的回应:

{ "user": [ "此字段为必填项。" ] }


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

JPG*_*JPG 5

这是因为该user字段不是read only field. 所以你必须做到这一点。

这个 DRF 文档 -指定只读字段很好地描述了它

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

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