Как обрабатывать создание/обновление для нескольких вложенных сериализаторов?

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

Модели:

class Brand(models.Model):
    name = models.CharField(max_length=500)

class Incentive(models.Model):
    name = models.CharField(max_length=500)
    brands = models.ManyToManyField(Brand, related_name='incentives_brand')
    start_dt = models.DateTimeField(auto_now_add=False, blank=True, null=True)
    end_dt = models.DateTimeField(auto_now_add=False, blank=True, null=True)

class Version(models.Model):
    name = models.CharField(max_length=1000)
    incentives = models.ManyToManyField(Incentive, related_name='versions_incentive', blank=True)
    brands = models.ManyToManyField(Brand, related_name='versions_brand')

Сериализаторы:

class BrandSerializer(serializers.ModelSerializer):    
    class Meta:
        model = Brand
        depth = 1
        fields = ['id', 'name']

class IncentiveSerializer(serializers.ModelSerializer):
    brands = BrandSerializer(many=True)
    
    class Meta:
        model = Incentive
        # depth = 1
        fields = ['id', 'name', 'brands', 'start_dt', 'end_dt']
    
class VersionSerializer(serializers.ModelSerializer): 
    incentives = IncentiveSerializer(many=True)
    brands = BrandSerializer(many=True)
       
    class Meta:
        model = Version
        fields = ['id', 'name', 'incentives', 'brands']
        
    def create(self, validated_data):
        brands = validated_data.pop('brands', [])
        incentives = validated_data.pop('incentives', [])
        instance = Version.objects.create(**validated_data)
        for brand_data in brands:
            brand = Brand.objects.get(**brand_data)
            instance.brands.add(brand)
        for incentive_data in incentives:
            incentive = Incentive.objects.get(**incentive_data)
            instance.incentives.add(incentive)
        return instance
    
    def update(self, instance, validated_data):
        brands = validated_data.pop('brands', [])
        incentives = validated_data.pop('incentives', [])
        instance = super().update(instance, validated_data)
        brand_objs = []
        incentive_objs = []
        for brand_data in brands:
            brand = Brand.objects.get(**brand_data)
            brand_objs.append(brand)
            instance.brands.set(brand_objs)
        for incentive_data in incentives:
            incentive = Incentive.objects.get(**incentive_data)
            incentive_objs.append(incentive)
            instance.incentives.set(incentive_objs)
        return instance 

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

TypeError: Поле 'id' ожидало число, но получило [OrderedDict([('name', 'Brand Test')])].

Затем с помощью PUT я получаю:

TypeError: Поле 'id' ожидало число, но получило [OrderedDict([('name', 'Brand Test')]), OrderedDict([('name', 'Brand 2 Test')]), OrderedDict([('name', 'Brand 3 Test')])]

Я думаю, что проблема кроется где-то здесь. Если потребуется дополнительный код, пожалуйста, дайте мне знать (например, представления, урлы). Я предполагаю, что в обновлении я не правильно очищаю список брендов. Я просто не могу его увидеть. Любая помощь будет оценена по достоинству.

Вернуться на верх