DRF IntegrityError:NOT NULL约束失败:user

编程入门 行业动态 更新时间:2024-10-28 07:28:18
本文介绍了DRF IntegrityError:NOT NULL约束失败:user_id的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我不知道如何将用户对象传递给以下序列化器:

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() 方法为

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

本文发布于:2023-10-22 20:56:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1518691.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:IntegrityError   DRF   user   NULL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!