Я пытаюсь сделать записываемый вложенный сериализатор в Django Rest Framework. Но я получаю ошибку проверки: slug требуется. но это внешний ключ и неизвестно до того, как произойдет вставка родительского объекта.
Вот мои модели и сериализаторы:
Модели:
class Letter(BaseModel):
char = models.CharField(
max_length=1,
)
slug = models.ForeignKey(
to="core.LetterSlug",
related_name="letters",
on_delete=models.CASCADE,
)
class LetterSlug(BaseModel):
char = models.CharField(
max_length=1,
)
Модели:
class LetterSerializer(serializers.ModelSerializer):
class Meta:
model = Letter
fields = '__all__'
class LetterSlugSerializer(serializers.ModelSerializer):
letters = LetterSerializer(many=True,instance=Letter.objects.all())
class Meta:
model = LetterSlug
fields = ('char', 'letters')
def create(self, validated_data):
letter_data = validated_data.pop('letters')
slug = LetterSlug.objects.create(**validated_data)
Letter.objects.create(slug=slug, **letter_data)
return slug
Я ожидаю, что он добавит несколько объектов Letter, все из которых используют один и тот же внешний ключ для вновь созданного объекта LetterSlug. [ ! d6]
Я пробовал комментировать содержимое своего метода create и убедился, что он находится во время проверки перед вызовом метода create.
просто сделайте пул только для чтения в LetterSerializer:
class LetterSerializer(serializers.ModelSerializer):
class Meta:
model = Letter
fields = '__all__'
read_only_fields = ("slug", )
также отредактируйте свой другой сериализатор, как показано ниже:
class LetterSlugSerializer(serializers.ModelSerializer):
letters = LetterSerializer(many=True)
class Meta:
model = LetterSlug
fields = ('char', 'letters')
def create(self, validated_data):
letters_data = validated_data.pop('letters')
slug = super().create(**validated_data)
Letter.objects.bulk_create([ Letter(slug=slug, **letter) for letter in letters_data ])
return slug