我创建了两个串行器-ASerializer
和BSerializer
。 A
模型具有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来处理嵌套序列化。