¿Establecer el atributo de la característica por nombre a través de QGIS python api?

13

Intento establecer atributos de características por nombre de atributo con este código

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

pero como resultado tengo NULL en todos los campos. Si yo uso

feature.setAttributes([1])

Funciona correctamente.

¿Qué hice mal? ¿Por qué la función [attrName] = 1 no funciona?

Actualización : encuentre esta solución

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}})
dmitry.v.kiselev
fuente

Respuestas:

18

QGIS puede usar nombres de campo e índices:

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

Asegúrese de estar en modo de edición antes de hacer algo en la capa:

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

#Call commit to save the changes
layer.commitChanges()
Nathan W
fuente
-1

AFAIK, QGIS utiliza índices de campo, no nombres de campo, para la asignación. Intenta usar feature[layer.fieldNameIndex(attrName)] = 1.

Jan Šimbera
fuente
Lo intento: feature.setAttribute(attrName, 1)y feature.setAttribute(layer.fieldNameIndex(attrName), 1)con los mismos resultados (la referencia de la API tiene dos métodos setAttribute para la función con índice y nombre)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1también el mismo.
dmitry.v.kiselev
¿Has inicializado los atributos ( feature.initAttributes(len(attributes)))?
Jan Šimbera
Añadir feature.initAttributes(1)con el mismo resultado. Pero compruebo feature[attrName]y obtuve 1 que estaba buscando. Pero aún tengo NULL si abro Attribute Table en gui.
dmitry.v.kiselev