Django REST Framework - Проблемы с вложенным сериализатором - Это поле обязательно для заполнения
Я всю ночь пытался заставить работать вложенный сериализатор, и сейчас я так глубоко погрузился в него, что с трудом отслеживаю сделанные изменения. Это для группового проекта для задания в университете, и я все еще совсем новичок в Django.
Я пытаюсь создать CreateAPIView, который использует сериализатор для создания композитора, получения/создания национальности для него, а затем добавляет строку в таблицу поиска с именем ComposerNationality.
Несколько раз мне удавалось приблизиться к этому. Но сейчас я получаю следующую ошибку при попытке отправить POSt через Postman:
"nationality_serializer": [
"This field is required."
]
Вот что у меня есть на данный момент:
models.py
class Composer(models.Model):
id = models.AutoField(primary_key=True)
firstName = models.CharField(max_length=100)
lastName = models.CharField(max_length=100)
birth = models.IntegerField(blank=True, null=True)
death = models.IntegerField(null=True, blank=True)
biography = models.TextField(blank=True, null=True, default = 'No Information Available, Check Back Later')
bio_source = models.CharField(max_length=200, blank=True, null=True, default = "")
featured = models.BooleanField(default=False)
composer_website = models.CharField(max_length=300, blank=True, null=True, default = "")
image = models.CharField(max_length=300, default = "https://i.picsum.photos/id/634/200/200.jpg?hmac=3WUmj9wMd1h3UZICk1C5iydU5fixjx0px9jw-LBezgg")
def __str__(self):
return self.firstName
class Nationality(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class ComposerNationality(models.Model):
composer = models.ForeignKey(Composer, on_delete=models.CASCADE)
nationality = models.ForeignKey(Nationality, on_delete=models.CASCADE)
def __str__(self):
return self.composer
serializers.py
class CreateComposerSerializer(serializers.ModelSerializer):
class TempNationalitySerializer(serializers.ModelSerializer):
class Meta:
model = Nationality
exclude = ['name']
nationality_serializer = TempNationalitySerializer()
class Meta:
model = Composer
fields = ['firstName', 'lastName', 'birth', 'death', 'biography', 'bio_source', 'featured', 'composer_website', 'image', 'nationality_serializer']
def create(self, validated_data):
nationality_data = validated_data.pop('nationality_serializer')
composer_instance = Composer.objects.create(**validated_data)
nationality_instance = Nationality.objects.get_or_create(name = nationality_data)
ComposerNationality.objects.create(composer = composer_instance, nationality = nationality_instance)
return composer_instance
views.py
class CreateComposer(CreateAPIView):
serializer_class = CreateComposerSerializer
queryset = Composer.objects.all()
def perform_create(self, serializer):
serializer.save()