1

我正在尝试使用 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()并且没有问题。现在,如果我使用它,我会得到“查询集没有属性保存”。

p.save()

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

我做错了什么?

提前致谢!

4

2 回答 2

0

.filter总是返回一个查询集,而不是单个实例。当您设置所有这些值时,您只是在该查询集对象上设置(以前不存在的)属性;您没有在模型实例中设置字段。您应该使用.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)

并且不需要任何其余的代码。

于 2019-03-18T22:11:58.793 回答
-1

filter()每当您期望不止一个对象符合您的条件时,您就需要。如果没有找到符合您的条件的项目,则filter()返回一个空查询集而不会引发错误。

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

p = get_object_or_404(ProductosBase, codigo_barra=row['codigo_barra'])
于 2019-03-18T22:16:35.060 回答