如何在 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>
我想做一个"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>