DRF IntegrityError: Сбой ограничения NOT NULL: user_id - PullRequest
0 голосов
/ 26 сентября 2018

Я не могу понять, как передать объект пользователя следующему сериализатору:

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}`
  }
})

Это дает мне эту трассировку .

Как передать объект пользователя в запрос?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

Удалить read_only=True из сериализатора

class ReviewSerializer(serializers.ModelSerializer):
    <b>user = UserSerializer()</b>

    class Meta:
        model = Review
        fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'review_text',)

Если вы установите read_only=True, DRF не будет принимать значениеиз входного источника , даже если он там есть

Из документа

Поля только для чтения включены в APIвывод, но не должен быть включен во ввод во время операций создания или обновления.Любые поля 'read_only', которые неправильно включены во вход сериализатора, будут игнорироваться.

Установите это значение на True, чтобы убедиться, что поле используется при сериализации представления, но неиспользуется при создании или обновлении экземпляра во время десериализации.

По умолчанию False


ОБНОВЛЕНИЕ
Выследует переопределить create() метод ReviewSerializer как

class ReviewSerializer(serializers.ModelSerializer):
    <b>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)</b>

    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)
...