shell 中的 Django 更新模型未保存

Django update model in shell not saving

我正在尝试使用 csv 更新现有模型的数据。我阅读文件并毫无问题地分配值。

如果我尝试 `MyModel.update() 一切正常运行但数据未保存。

with open('Productosold.csv') as csvfile:
     reader = csv.DictReader(csvfile)
     for row in reader:
        p = ProductosBase.objects.filter(codigo_barra = row['codigo_barra'])
        p.region=row['region']
        p.producto_ing=row['producto_ing']
        p.packaging_ing=row['packaging_ing']
        p.precio_compra=row['precio_compra']
        p.uom=row['uom']
        p.units_inner=row['units_inner']
        p.inner_master=row['inner_master']
        p.tier=row['tier']
        p.precio_lista_internacional=row['precio_lista_internacional']
        p.update()

我通常使用 MyModel.save() 方法上传新数据,没有问题。 现在,如果我使用它,我会得到 "Queryset has no attribute save".

p.save()

如果我打印一些 p.values 我可以看到它们从 csv 文件中正确填充。

我做错了什么?

提前致谢!

.filter 总是 returns 一个查询集,而不是单个实例。当您设置所有这些值时,您只是将(以前不存在的)属性设置到该查询集对象上;您没有在模型实例中设置字段。您应该使用 .get 获取一个实例并保存它。

p = ProductosBase.objects.get(codigo_barra = row['codigo_barra'])
p.region=row['region']
...
p.save()

但是,由于 CSV 中的所有列都精确映射到模型中的字段,因此您实际上可以使用 filterupdate 一次性完成所有操作:

for row in reader:
    ProductosBase.objects.filter(codigo_barra=row['codigo_barra']).update(**row)

并且不需要任何其他代码。

只要您希望有不止一件符合您条件的物品,您就需要 filter()。如果找不到符合您条件的项目,filter() returns 是空查询集,不会引发错误。

您也可以使用 get(),但当您希望有一个(且只有一个)项目符合您的条件时。如果项目不存在或存在多个符合条件的项目,Get 将引发错误。因此,您应该始终在 try.. except .. 块中使用 if 或使用像 get_object_or_404 这样的快捷函数来正确处理异常。在这种情况下,我建议使用 get_object_or_404

p = get_object_or_404(ProductosBase, codigo_barra=row['codigo_barra'])