You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QGIS 3.28使用Python API设置图层字段约束失效问题求助

QGIS字段约束设置无效问题
  • 使用版本:QGIS 3.28 Firenze
  • 需求:给空白图层字段设置约束,具体包括:
    • 指定字段必填(NotNull约束+强制非空)
    • 部分字段设置数值范围约束
  • 现状:通过PyQGIS从Excel读取字段参数,已成功配置属性表单部件类型、下拉列表、字段可编辑状态及默认值,但约束设置完全无效——代码运行无报错,其他配置均正常,仅约束不生效。

用到的代码片段

import pandas as pd
from qgis.core import QgsProject, QgsFieldConstraints, QgsDefaultValue

# 加载Excel文件到DataFrame
df = pd.read_excel('EXCELPATH.xlsx')

project = QgsProject.instance()

i = 1
for index, row in df.iterrows():
    layer_name = row['LayerName']
    layer = project.mapLayersByName(layer_name)[0] if project.mapLayersByName(layer_name) else None

    if layer:
        field_idx = layer.fields().indexOf(row['FieldName'])

        if field_idx != -1:  # 图层中存在匹配字段
            print(i, "-", layer.name())   

            
            # 约束设置部分
            if 'Constraints/NotNull' in df.columns and 'Constraints/Expression' in df.columns:
                # 初始化约束配置
                constraintsconfig = QgsFieldConstraints()

                # 非空约束及强制生效
                if row['Constraints/NotNull'] == True:
                    print("NotNull Constraints READ")
                    constraintsconfig.setConstraint(QgsFieldConstraints.ConstraintNotNull, QgsFieldConstraints.ConstraintOriginLayer)
                    constraintsconfig.setConstraintStrength(QgsFieldConstraints.ConstraintNotNull, QgsFieldConstraints.ConstraintStrengthHard)

                # 表达式约束及描述
                if pd.notna(row['Constraints/Expression']):
                    print("Constraints Expression READ")
                    constraintsconfig.setConstraint(QgsFieldConstraints.ConstraintExpression, QgsFieldConstraints.ConstraintOriginLayer)
                    constraintsconfig.setConstraintStrength(QgsFieldConstraints.ConstraintExpression, QgsFieldConstraints.ConstraintStrengthHard)
                    
                    print("Constraints Expression Description READ")
                    constraintsconfig.setConstraintExpression(row['Constraints/Expression'], row['Constraints/ExpressionDescription'])
                    print(row['FieldName'], "Constraints Applied:", row['Constraints/Expression'], row['Constraints/ExpressionDescription'])

                # 更新图层字段约束
                fields = layer.fields()
                field = fields.field(field_idx)
                print(field.name())
                field.setConstraints(constraintsconfig)
                
            # 更新字段并提交更改
            layer.updateFields()     

            i=i+1

project.write()

内容的提问来源于stack exchange,提问作者KM_GIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:25:18