将对象ID从嵌套序列化器传递到Django Rest Framework中的父序列化器

时间:2019-07-04 17:40:24

标签: django django-rest-framework

我创建了两个串行器-ASerializerBSerializerA模型具有b相对于B的多对多字段。我的目标是能够在更新B对象的同时更新多个嵌套的A对象。我的序列化器:

class ASerializer(WritableNestedModelSerializer):
    b = BSerializer(many=True)

    class Meta:
        model = A
        fields = '__all__'
        read_only_fields = ['id']

    def update(self, instance, validated_data):

        info = model_meta.get_field_info(instance)
        bs_data = validated_data.pop('b', None)

        for attr, value in validated_data.items():
            if attr in info.relations and info.relations[attr].to_many:
                field = getattr(instance, attr)
                field.set(value)
            else:
                setattr(instance, attr, value)

        if bs_data:
            for b_data in bs_data:
                b_serializer = BSerializer(data=b_data)
                if b_serializer.is_valid():
                    b = B.objects.update(**b_data)
                    instance.b.add(b)
                else:
                    raise exceptions.ValidationError(todo_serializer.errors)
        return instance

class BSerializer(serializers.ModelSerializer):
    class Meta:
        model = B
        fields = '__all__'
        read_only_fields = ['id']

和型号:

class A(models.Model):
    name = models.CharField('Name', max_length=250)
    content = models.TextField('Content')
    b = models.ManyToManyField('bs.B', blank=True, null=True, verbose_name='b', related_name='as')

class B(models.Model):
    name = models.CharField('Name', max_length=250)
    description = models.TextField('Description')

我遇到的问题是,在更新(PATCH)期间,打印bs_data时,我得到的只是

[OrderedDict([('name', 'test'), ('description', 'none')]),
 OrderedDict([('name', 'another'), ('description', 'one')])]

而且我无法更新所有嵌套的B对象-每个嵌套对象都获取最后一个提供的内容(因此在上面的示例中,每个嵌套对象都将填充“另一个”名称和“一个”描述) 。如果我有对象ID,那将很容易,但是它不会传递给validated_data方法内的update()。我尝试过的是添加

id = serializers.IntegerField(required=False)

但是仍然没有对象ID validated_data。我也尝试过ReadOnlyField(),也没有运气。基本上,我的目标是从嵌套对象传递对象ID,因此我可以引用它并进行修改。这是我模型中唯一的唯一字段。我正在使用drf-writable-nested lib来处理嵌套序列化。

0 个答案:

没有答案