class QSqlRelationalTableModel#

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

Inheritance diagram of PySide6.QtSql.QSqlRelationalTableModel

摘要#

方法#

  • def __init__()

  • def relation()

  • def setJoinMode()

虚函数#

注意

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

详细描述#

警告

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

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

noforeignkeys1

foreignkeys2

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

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

model.setTable("employee")

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

setRelation() 函数调用建立两个表之间的关系。第一次调用的指定了`employee`表中的第2列是一个外键,映射到`city`表的`id`字段,并且视图应向用户呈现`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)。别名可用于过滤表(例如,设置过滤器:“relTblAl_2=’Oslo’ OR relTblAl_3=’USA’”)。

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

参见

QSqlRelation QSqlRelationalDelegate 关系表模型示例

class JoinMode#

常量

描述

QSqlRelationalTableModel.InnerJoin

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

QSqlRelationalTableModel.LeftJoin

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

参见

setJoinMode()

__init__([parent=None[, db=QSqlDatabase()]])#
参数:

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

relation(column)#
参数:

– int

返回类型:

QSqlRelation

返回指定列column的关联,如果没有设置关联则返回无效关联。

参见

setRelation() isValid()

relationModel(column)#
参数:

– int

返回类型:

QSqlTableModel

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

返回的对象归QSqlRelationalTableModel所有。

参见

setRelation() relation()

setJoinMode(joinMode)#
参数:

连接模式JoinMode

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

参见

连接模式

setRelation(column, relation)#
参数:

警告

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

允许特定的 通过 relation 指定为一个外键索引。

示例

model.setTable("employee")

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

setRelation() 调用指定了表 employee 中的第 2 列是外键,与表 cityid 字段相关联,并且视图应将 cityname 字段呈现给用户。

注意:表的 主键可能不包含与其他表的关联。

参见

relation()