Shell中的Django更新模型无法保存

时间:2019-03-18 22:07:02

标签: django django-shell

我正在尝试使用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文件正确填充。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

,不需要任何其他代码。

答案 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'])