djangodjango-shell

Django update model in shell not saving


I´m trying to update the data of an existing model with a csv. I read the file and assign the values with no problem.

If I try `MyModel.update() everything runs with no error but the data is not saved.

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()

I usualy upload new data using the MyModel.save() method and have no problem. Now, if I use that I get "Queryset has no attribute save".

p.save()

If I print some of the p.values I can see they are populated correctly from the csv file.

What I´m doing wrong?

Thanks in advance!


Solution

  • .filter always returns a queryset, not a single instance. When you set all those values, you are just setting (previously non-existing) attributes onto that queryset object; you are not setting fields in a model instance. You should use .get to get an instance and save that.

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

    However, since all the columns in your CSV map precisely to fields on the model, you could in fact use filter and update to do the whole thing in one go:

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

    and no need for any of the rest of the code.