Django 可写嵌套序列化程序更新
Posted
技术标签:
【中文标题】Django 可写嵌套序列化程序更新【英文标题】:Django Writable Nested Serializers Update 【发布时间】:2018-11-12 05:45:27 【问题描述】:我无法通过补丁请求更新记录,我已经看到我必须添加更新方法,但我无法理解它实际上是如何工作的。我是 Django 新手。
模式是mysql:
model.py
class Medida(models.Model):
descripcion = models.CharField(max_length = 100)
class Meta:
ordering = ('descripcion',)
class Sucursal(models.Model):
descripcion = models.CharField(max_length = 100)
class Meta:
ordering = ('descripcion',)
class Item(models.Model):
codigo = models.CharField(max_length = 4)
descripcion = models.CharField(max_length = 100)
class Meta:
ordering = ('codigo',)
class Almacen(models.Model):
item = models.ForeignKey(Item, on_delete = models.CASCADE)
peso = models.FloatField()
medida = models.ForeignKey(Medida, on_delete = models.CASCADE)
sucursal = models.ForeignKey(Sucursal, on_delete = models.CASCADE)
class Meta:
ordering = ('item',)
serializers.py
class MedidaSerializer(serializers.ModelSerializer):
class Meta:
model = Medida
fields = ('id', 'descripcion')
class SucursalSerializer(serializers.ModelSerializer):
class Meta:
model = Sucursal
fields = ('id', 'descripcion')
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ('id', 'codigo', 'descripcion')
class AlmacenSerializer(serializers.ModelSerializer):
medida = MedidaSerializer(read_only = True)
item = ItemSerializer(read_only = True)
sucursal = SucursalSerializer(read_only = False)
class Meta:
model = Almacen
fields = ('id', 'item', 'peso', 'medida', 'sucursal')
json 的答案是正确的,但是当你想修改时,在这种情况下是一个带有对象的分支。不工作。
例如:
请求:
"id": 2,
"item":
"id": 2,
"codigo": "0002",
"descripcion": "Anilina"
,
"peso": 2000.1,
"medida":
"id": 2,
"descripcion": "Kilogramos"
,
"sucursal":
"id": 2,
"descripcion": "Magalena"
补丁:
"id": 2,
"item":
"id": 2,
"codigo": "0002",
"descripcion": "Anilina"
,
"peso": 2000.1,
"medida":
"id": 2,
"descripcion": "Kilogramos"
,
"sucursal":
"id": 1,
"descripcion": "La Plata"
感谢您抽出宝贵时间阅读我的查询,并提前感谢您的回复。
【问题讨论】:
发布相关视图 【参考方案1】:在您的 AlmacenSerializer 中尝试此代码。
def update(self, instance, validated_data):
item_data = validated_data.pop('item')
medida_data = validated_data.pop('medida')
sucursal_data = validated_data.pop('sucursal')
item = instance.item
for k, v in item_data.items():
setattr(item, k, v)
item.save()
medida = instance.medida
for k, v in medida_data.items():
setattr(medida, k, v)
medida.save()
sucursal = instance.sucursal
for k, v in sucursal_data.items():
setattr(sucursal, k, v)
sucursal.save()
instance.peso = validated_data.get('peso', instance.peso)
instance.save()
return instance
【讨论】:
k
和 v
在 for
循环中代表什么?
k 代表键,v 代表值以上是关于Django 可写嵌套序列化程序更新的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django Rest Framework 3.2.2 具有现有对象的可写嵌套序列化程序
如何在实例中有自定义 .update() 以更新 DRF 可写嵌套序列化程序中的多对多关系时更新值
在 Django Rest Framework 中正确更新嵌套序列化程序