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 中的所有列都精确映射到模型中的字段,因此您实际上可以使用 filter
和 update
一次性完成所有操作:
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'])
我正在尝试使用 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 中的所有列都精确映射到模型中的字段,因此您实际上可以使用 filter
和 update
一次性完成所有操作:
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'])