Django可写嵌套序列化器更新

时间:2018-06-02 06:54:49

标签: python django angular api django-rest-framework

我无法使用补丁请求更新记录,我已经看到我必须添加更新方法,但我无法理解它是如何工作的。我是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 个答案:

答案 0 :(得分:2)

在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