Задать атрибут объекта по имени через QGIS python api?

13

Я пытаюсь установить атрибуты объекта по имени атрибута с этим кодом

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

но в результате у меня есть NULL во всех полях. Если я использую

feature.setAttributes([1])

это работает правильно.

Что я делаю не так? Почему функция [attrName] = 1 не работает?

Обновление : найти это решение

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
источник

Ответы:

18

QGIS может использовать имена полей и индексы:

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

Убедитесь, что вы находитесь в режиме редактирования, прежде чем делать что-либо на слое:

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

#Call commit to save the changes
layer.commitChanges()
Натан У
источник
-1

AFAIK, QGIS использует индексы полей, а не имена полей, для назначения. Попробуйте использовать feature[layer.fieldNameIndex(attrName)] = 1.

Ян Шимбера
источник
Я пытаюсь: feature.setAttribute(attrName, 1)и feature.setAttribute(layer.fieldNameIndex(attrName), 1)с теми же результатами (у API есть два метода setAttribute для функции с индексом и именем)
dmitry.v.kiselev
feature[layer.fieldNameIndex(attrName)] = 1тоже самое.
dmitry.v.kiselev
Вы инициализировали атрибуты ( feature.initAttributes(len(attributes)))?
Ян Шимбера
Добавить feature.initAttributes(1)с тем же результатом. Но проверить feature[attrName]и получил 1, который я искал. Но все равно имейте NULL, если я открою таблицу атрибутов в графическом интерфейсе.
dmitry.v.kiselev