Записываемый вложенной сериализатор на ошибку проверки фрейма django rest на вложенный внешний ключ. Поле, обязательное для заполнения

Я пытаюсь сделать записываемый вложенный сериализатор в 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.

1
задан 13 August 2018 в 15:37

1 ответ

просто сделайте пул только для чтения в 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
0
ответ дан 15 August 2018 в 17:00

Другие вопросы по тегам:

Похожие вопросы: