Как обрабатывать создание/обновление для нескольких вложенных сериализаторов?
Я смог сделать так, чтобы создание/обновление происходило на вложенных сериализаторах, но я не могу заставить это работать, когда есть несколько много-много вложенных сериализаторов.
Модели:
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')])]
Я думаю, что проблема кроется где-то здесь. Если потребуется дополнительный код, пожалуйста, дайте мне знать (например, представления, урлы). Я предполагаю, что в обновлении я не правильно очищаю список брендов. Я просто не могу его увидеть. Любая помощь будет оценена по достоинству.