Обновление метода Create в Django Rest Framework для двух вложенных сериализаторов

Я нашел много ответов на похожие вопросы, но не на мой конкретный. Я пытаюсь обновить метод Create для моего сериализатора, который имеет два вложенных сериализатора:

class TaskSerializer(serializers.ModelSerializer):
    products = ProductSerializer()
    prep = PrepSerializer()

    class Meta:
        model = Task
        fields = '__all__'

    def create(self, validated_data):           
        products_data = validated_data.pop('products')
        task = Task.objects.create(**validated_data)
        for products_data in products_data:
            Product.objects.create(task=task, **products_data)
        return task

Я хочу добавить вложенный сериализатор "prep", чтобы он обновлялся в то же время, но не могу правильно подобрать синтаксис.

Любая помощь, очень признательна.

Это должно работать нормально, я думаю, что вам не хватает many=True. Это работает? (Предполагается, что products и prep должно быть много)

А также предполагая, что ваши модели структурированы следующим образом:

class Task(models.Model)
    #fields

class Product(models.Model)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)

class Prep(models.Model)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
class TaskSerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True)
    preps = PrepSerializer(many=True)

    class Meta:
        model = Task
        fields = '__all__'

    def create(self, validated_data):           
        products_data = validated_data.pop('products')
        preps_data = validated_data.pop('preps')
        task = Task.objects.create(**validated_data)

        for products_data in products_data:
            Product.objects.create(task=task, **products_data)
        
        for prep_data in preps_data:
            Prep.objects.create(task=task, **prep_data)

        return task

Тогда вы можете отправить запрос типа:

{
    "products": [
        {"foo": "bar"}
    ],
    "preps": [
        {"foo": "bar"}
    ],
}
Вернуться на верх