diff --git a/src/core/featuremodel.cpp b/src/core/featuremodel.cpp index b500ebdfd5..04e1377a3e 100644 --- a/src/core/featuremodel.cpp +++ b/src/core/featuremodel.cpp @@ -740,11 +740,13 @@ bool FeatureModel::create() return false; } + bool hasRelations = false; QList> revisitRelations; if ( mProject ) { // Gather any relationship children which would have relied on an auto-generated field value const QList relations = mProject->relationManager()->referencedRelations( mLayer ); + hasRelations = !relations.isEmpty(); QgsFeature temporaryFeature = mFeature; for ( const QgsRelation &relation : relations ) { @@ -781,25 +783,32 @@ bool FeatureModel::create() QgsFeature feat; if ( mLayer->getFeatures( QgsFeatureRequest().setFilterFid( createdFeatureId ) ).nextFeature( feat ) ) { - // Revisit relations in need of attribute updates - for ( const QPair &revisitRelation : std::as_const( revisitRelations ) ) + setFeature( feat ); + + if ( hasRelations ) { - const QList fieldPairs = revisitRelation.first.fieldPairs(); - revisitRelation.first.referencingLayer()->startEditing(); - QgsFeatureIterator it = revisitRelation.first.referencingLayer()->getFeatures( revisitRelation.second ); - QgsFeature childFeature; - while ( it.nextFeature( childFeature ) ) + // Revisit relations in need of attribute updates + for ( const QPair &revisitRelation : std::as_const( revisitRelations ) ) { - for ( const QgsRelation::FieldPair fieldPair : fieldPairs ) + const QList fieldPairs = revisitRelation.first.fieldPairs(); + revisitRelation.first.referencingLayer()->startEditing(); + QgsFeatureIterator it = revisitRelation.first.referencingLayer()->getFeatures( revisitRelation.second ); + QgsFeature childFeature; + while ( it.nextFeature( childFeature ) ) { - childFeature.setAttribute( fieldPair.referencingField(), feat.attribute( fieldPair.referencedField() ) ); + for ( const QgsRelation::FieldPair fieldPair : fieldPairs ) + { + childFeature.setAttribute( fieldPair.referencingField(), feat.attribute( fieldPair.referencedField() ) ); + } + revisitRelation.first.referencingLayer()->updateFeature( childFeature ); } - revisitRelation.first.referencingLayer()->updateFeature( childFeature ); + revisitRelation.first.referencingLayer()->commitChanges(); } - revisitRelation.first.referencingLayer()->commitChanges(); - } - setFeature( feat ); + // We need to update default values after creation to insure expression relying on relation children compute properly + updateDefaultValues(); + save(); + } } else {