Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Writable Nested Serializers Update

I can not update records with a patch request, I have seen that I must add the update method, but I can not understand how it actually works. I'm new to django.

The modes is 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')

The json answer is correct, but when you want to modify, in this case a branch with an object. Does not work.

For example:

Request:

{
    "id": 2,
    "item": {
        "id": 2,
        "codigo": "0002",
        "descripcion": "Anilina"
    },
    "peso": 2000.1,
    "medida": {
        "id": 2,
        "descripcion": "Kilogramos"
    },
    "sucursal": {
        "id": 2,
        "descripcion": "Magalena"
    }
}

Patch:

{
    "id": 2,
    "item": {
        "id": 2,
        "codigo": "0002",
        "descripcion": "Anilina"
    },
    "peso": 2000.1,
    "medida": {
        "id": 2,
        "descripcion": "Kilogramos"
    },
    "sucursal": {
        "id": 1,
        "descripcion": "La Plata"
    }
}

Thanks for taking the time to read my query and, thank you in advance for the response.

like image 738
German Avalos Avatar asked Oct 19 '25 14:10

German Avalos


1 Answers

Try this code into your 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
like image 140
Hasan Avatar answered Oct 21 '25 03:10

Hasan