Django rest устанавливает отношение "один к одному", создавая метод post
Я новичок в django, я создал модели с отношениями OnetoOne, у меня есть таблица пользователей и у меня есть отношения Onetoone с таблицей библиотеки раскадровок, проблема в том, что когда я создаю объект storyboardlibraby, мне нужно сохранить объект пользователя в поле Onetoone, даже после добавления объекта пользователя не удается сохранить storyboardlibrary в базе данных, если кто-нибудь может помочь в этом, пожалуйста, помогите мне, я добавлю код, который я написал.
class StoryboardLibrary(models.Model):
name = models.CharField(max_length=50)
data = JSONField(db_index=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self):
return "%s The Library" % self.name
Класс сериализатора
class StoryboardSerializer(serializers.ModelSerializer):
class Meta:
model = StoryboardLibrary
fields = ('data','name','user')
просматривает метод post
def add_storyboard(request):
# validating for already existing data
if StoryboardLibrary.objects.filter(**request.data).exists():
raise serializers.ValidationError('This data already exists')
user = get_object_or_404(User, id=request.user.id)
request.data['user'] = user
storyboard = StoryboardSerializer(data=request.data)
print(storyboard)
if storyboard.is_valid():
storyboard.save()
return Response(storyboard.data, status=status.HTTP_201_CREATED)
else:
return Response(status=status.HTTP_404_NOT_FOUND)
После нажатия кнопки post api я не могу сохранить данные storyboardserializer не действителен, поэтому он выполняет блок else и возвращает статус 404 not found
Итак, здесь вы фильтруете с запрашиваемым пользователем, так
get_object_or_404
не требуется, так как если запрос приходит, то уже есть пользователь и id.
также request.data неизменяем, вы не можете его изменить. поэтому вы не можете добавить (изменить) своего пользователя к полученным данным.
request.data['user'] = user
скорее вы можете передать контекст вашему сериализатору с помощью
storyboard = StoryboardSerializer(data=request.data, context = {'request':request})
и сохранить пользователя в методе create serializer или непосредственно сохранить пользователя как -
storyboard.save(user=request.user.id)