ユーザーオブジェクトを次のシリアライザーに渡す方法がわかりません。
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リクエストは次のようになります:
return axios({
method: 'post',
url: 'http://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}`
}
})
それは私にこのトレースバックを与えます。
ユーザーオブジェクトをリクエストに渡すにはどうすればよいですか?
前もって感謝します。
シリアライザーread_only=True
から削除
class ReviewSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Review
fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'review_text',)
を設定するread_only=True
と、DRFは、入力ソースが存在する場合でも、入力ソースから値を取得しません。
ドキュメントから、
読み取り専用フィールドはAPI出力に含まれていますが、作成または更新操作中の入力には含めないでください。シリアライザー入力に誤って含まれている「read_only」フィールドはすべて無視されます。
これを設定
True
すると、表現をシリアル化するときにフィールドが使用されますが、逆シリアル化中にインスタンスを作成または更新するときには使用されません。デフォルトは
False
UPDATE
あなたはオーバーライドする必要がありますcreate()
方法ReviewSerializer
としての
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加