我正在尝试使用csv更新现有模型的数据。我读取了文件并毫无问题地分配了值。
如果我尝试`MyModel.update(),那么一切都会正常运行,但不会保存数据。
timepicker
我通常使用 Construct.MainDataTable.Columns.Add("Date", typeof(DateTime));
//I would like the column below to only display times
Construct.MainDataTable.Columns.Add("Time",typeof(DateTime));
//My timepickers
timePicker1.Format = DateTimePickerFormat.Custom;
timePicker1.CustomFormat = "HH:mm:ss";
timePicker1.ShowUpDown = true;
string timepicker1Value = timePicker1.Value.ToString("HH:mm:ss");
timePicker2.Format = DateTimePickerFormat.Custom;
timePicker2.CustomFormat = "HH:mm:ss"; // Only use hours and minutes
timePicker2.ShowUpDown = true;
string timepicker2Value = timePicker2.Value.ToString("HH:mm:ss");
//the row filter uses the time column to filter rows
Construct.MainDataTable.DefaultView.RowFilter = "Time >= '" + timePicker1.Value.ToLongTimeString() + "' and Time <= '" +
timePicker2.Value.ToLongTimeString() + "'";
方法上传新数据,没有问题。
现在,如果使用该命令,则会显示“ Queryset没有属性保存”。
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()
如果我打印一些p.value,我可以看到它们已从csv文件正确填充。
我做错了什么?
谢谢!
答案 0 :(得分:0)
.filter
始终返回查询集,而不是单个实例。设置所有这些值时,仅是在该queryset对象上设置(以前不存在)属性。您没有在模型实例中设置字段。您应该使用.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)
,不需要任何其他代码。
答案 1 :(得分:-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'])