14

I try to set feature attributes by attribute name with this code

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1

but in result I have NULL in all fields. If I use

feature.setAttributes([1])

it works properly.

What I do wrong? Why feature[attrName] = 1 doesn't work?

Update: Find this solution

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1
 pr.changeAttributeValues({feature.id() : {pr.fieldNameMap()[attrName] : 1}})
PolyGeo
  • 65,136
  • 29
  • 109
  • 338
dmitry.v.kiselev
  • 1,666
  • 1
  • 11
  • 23

2 Answers2

24

QGIS can use field names and indexes:

feature['fieldname'] = 10
feature[1] = 10

Make sure you are in edit mode before you do anything on the layer:

layer.startEditing()
feature['fieldname'] = 10
layer.updateFeature(feature)

#Call commit to save the changes
layer.commitChanges()
Nathan W
  • 34,706
  • 5
  • 97
  • 148
-1

AFAIK, QGIS uses field indexes, not field names, for assignment. Try using feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
  • 1,314
  • 9
  • 12