我不知道如何将用户对象传递给以下序列化器:
I can't figure out how to pass user object to the following serializer:
class ReviewSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) class Meta: model = Review fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'review_text',)我有此视图集:
class ReviewsViewSet(viewsets.ModelViewSet): queryset = Review.objects.all() serializer_class = ReviewSerializer此模型:
class Review(models.Model): title = models.CharField(max_length=255) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews') movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name='reviews') review_text = models.TextField() timestamp = models.DateTimeField(auto_now_add=True) def __str__(self): return '{movie} review by {user}'.format(user=self.user, movie=self.movie)我的JavaScript请求如下:
My javascript request looks like this:
return axios({ method: 'post', url: 'localhost:8000/api/reviews/', data: { // Using data from Vue title: this.review_title, movie: this.id, review_text: this.review_text, user: JSON.stringify(this.user) }, headers: { 'Content-Type': 'application/json', Authorization: `JWT ${token}` } })它给了我此traceback 。
我应该如何将用户对象传递给请求?
How should I pass the user object to the request?
请先谢谢。
推荐答案删除 read_only = True 来自序列化器
Remove read_only=True from serializer
class ReviewSerializer(serializers.ModelSerializer): user = UserSerializer() class Meta: model = Review fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'review_text',)如果设置 read_only = True ,则DRF 不会从输入源获取值 ,即使在那里 从文档中
If you set read_only=True, the DRF will not takes the value from input source even if it's there From the doc,
只读字段包含在API输出中,但在创建或更新操作期间不应包含在输入中的。序列化器输入中错误包含的所有'read_only'字段都将被忽略。
Read-only fields are included in the API output, but should not be included in the input during create or update operations. Any 'read_only' fields that are incorrectly included in the serializer input will be ignored.
将此设置为 True 以确保在序列化表示形式时使用该字段,而在反序列化期间创建或更新实例时不使用该字段。
Set this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization.
默认为 False
Defaults to False
更新 您应覆盖 create()$ c ReviewSerializer 的$ c> 方法为
class ReviewSerializer(serializers.ModelSerializer): user = UserSerializer() def create(self, validated_data): user_dict = validated_data.pop('user') user_obj, created = User.objects.get_or_create(**user_dict) return Review.objects.create(user=user_obj, **validated_data) class Meta: model = Review fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'review_text',)仅用于调试目的
class ReviewsViewSet(viewsets.ModelViewSet): queryset = Review.objects.all() serializer_class = ReviewSerializer def create(self, request, *args, **kwargs): print(request.data) # print here <<<< return super(ReviewsViewSet, self).create(request, *args, **kwargs)更多推荐
DRF IntegrityError:NOT NULL约束失败:user
发布评论