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

【讨论】:

kvfor 循环中代表什么? k 代表键,v 代表值

以上是关于Django 可写嵌套序列化程序更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django Rest Framework 3.2.2 具有现有对象的可写嵌套序列化程序

如何在实例中有自定义 .update() 以更新 DRF 可写嵌套序列化程序中的多对多关系时更新值

在 Django Rest Framework 中正确更新嵌套序列化程序

嵌套可写序列化程序上的验证错误

python django-rest-framework 3.3.3 更新嵌套序列化程序

Django Rest Framework,如何更新序列化程序中的嵌套值