python - Django 可写嵌套序列化器更新

标签 python django angular api django-rest-framework

我无法使用补丁请求更新记录,我已经看到我必须添加更新方法,但我无法理解它实际上是如何工作的。我是 Django 新手。

模式是mysql:

模型.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',)

序列化器.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"
    }
}

感谢您花时间阅读我的查询,并提前感谢您的回复。

最佳答案

在您的 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

关于python - Django 可写嵌套序列化器更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50654337/

相关文章:

python - Django、子域和 mod_rewrite。 URL 搞乱了部署设置

angular - 如何使用 .distinct 通过对象属性的内容从数组中删除对象

typescript - `enableProdMode()` 时到底发生了什么

css - 如何修复轮播元素编号以显示?

python - Tkinter 小部件全部打包在同一个框架中

python - Pandas :按日期返回出现次数

python - 在 Mac OSX El Capitan 下如何让 PyC​​harm 识别 Python 2.7 中的 sys 模块?

python - 如果我使用 virtualenv,为什么还要使用 vagrant?

python - Django 中的全局小数舍入选项

python - Pandas read_csv 忽略不合格行