Обновление записываемых вложенных сериализаторов Django - PullRequest
0 голосов
/ 02 июня 2018

Я не могу обновить записи с помощью запроса на исправление, я видел, что должен добавить метод обновления, но я не могу понять, как он на самом деле работает.Я новичок в 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 голосов
/ 02 июня 2018

Попробуйте этот код в вашем 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
...