PySide6.QtSql.QSqlRelationalTableModel

class QSqlRelationalTableModel

QSqlRelationalTableModel 类为单个数据库表提供了一个可编辑的数据模型,并支持外键。更多

PySide6.QtSql.QSqlRelationalTableModel 的继承图

概要

方法

虚拟方法

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QSqlRelationalTableModel 的行为类似于 QSqlTableModel,但允许将列设置为其他数据库表的外键。

foreignkeys2

foreignkeys2

左侧的截图显示了在QTableView中的一个普通QSqlTableModel。外键(citycountry)没有解析为人类可读的值。右侧的截图显示了一个QSqlRelationalTableModel,外键被解析为人类可读的文本字符串。

以下代码片段展示了如何设置QSqlRelationalTableModel

model.setTable("employee")

model.setRelation(2, QSqlRelation("city", "id", "name"))
model.setRelation(3, QSqlRelation("country", "id", "name"))

setRelation() 函数调用用于在两个表之间建立关系。第一次调用指定了表 employee 中的第2列是与表 cityid 字段映射的外键,并且视图应向用户展示 city 表的 name 字段。第二次调用对第3列执行了类似的操作。

如果您使用读写模式的QSqlRelationalTableModel,您可能希望在视图上使用QSqlRelationalDelegate。与默认的委托不同,QSqlRelationalDelegate为外键字段提供了一个组合框,这些字段指向其他表。要使用这个类,只需在视图上调用QAbstractItemView::setItemDelegate(),并传入QSqlRelationalDelegate的实例:

std.unique_ptr<QTableView> view{QTableView()}
view.setModel(model)
view.setItemDelegate(QSqlRelationalDelegate(view.get()))

relationaltablemodel 示例展示了如何使用 QSqlRelationalTableModelQSqlRelationalDelegate 结合,以提供支持外键的表格。

../../_images/relationaltable.png

备注:

  • 表必须声明一个主键。

  • 表的主键不能包含对另一个表的关系。

  • 如果关系表中包含引用表中不存在的行的键,则包含无效键的行将不会通过模型暴露。用户或数据库负责保持引用完整性。

  • 如果一个关系的显示列名也被用作关系表中的列名,或者如果它被用作多个关系中的显示列名,它将被别名化。别名是关系的表名、显示列名和一个由下划线连接的唯一ID(例如tablename_columnname_id)。fieldName()将返回别名化的列名。当检测到重复时,所有重复的显示列名都会被别名化,但主表中的列名不会被别名化。别名化不会影响QSqlRelation,因此displayColumn()将返回原始的显示列名。

  • 参考表名被别名化。别名是单词“relTblAl”和由下划线连接的相关列索引(例如relTblAl_2)。该别名可用于过滤表(例如,setFilter(“relTblAl_2=’Oslo’ OR relTblAl_3=’USA’”))。

  • 当使用 setData() 时,角色应始终为 Qt::EditRole,而当使用 data() 时,角色应始终为 Qt::DisplayRole。

另请参阅

QSqlRelation QSqlRelationalDelegate 关系表模型示例

class JoinMode

常量

描述

QSqlRelationalTableModel.InnerJoin

  • 内连接模式,当两个表中至少有一个匹配时返回行。

QSqlRelationalTableModel.LeftJoin

  • 左连接模式,返回左表(table_name1)中的所有行,即使右表(table_name2)中没有匹配项。

另请参阅

setJoinMode()

__init__([parent=None[, db=QSqlDatabase()]])
Parameters:

创建一个空的QSqlRelationalTableModel,并将父对象设置为parent,数据库连接设置为db。如果db无效,将使用默认的数据库连接。

relation(column)
Parameters:

– int

Return type:

QSqlRelation

返回列 column 的关系,如果未设置关系,则返回无效关系。

另请参阅

setRelation() isValid()

relationModel(column)
Parameters:

– int

Return type:

QSqlTableModel

返回一个QSqlTableModel对象,用于访问column作为外键的表,如果给定的column没有关系,则返回None

返回的对象由QSqlRelationalTableModel拥有。

另请参阅

setRelation() relation()

setJoinMode(joinMode)
Parameters:

joinModeJoinMode

设置SQL joinMode 以显示或隐藏具有NULL外键的行。在 InnerJoin 模式(默认)下,这些行将不会显示:如果您想显示它们,请使用 LeftJoin 模式。

另请参阅

JoinMode

setRelation(column, relation)
Parameters:

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

让指定的column成为由relation指定的外键索引。

示例:

model.setTable("employee")

model.setRelation(2, QSqlRelation("city", "id", "name"))

setRelation() 调用指定表 employee 中的第2列是与表 cityid 字段映射的外键,并且视图应向用户展示 cityname 字段。

注意:表的主键可能不包含与另一个表的关系。

另请参阅

relation()