我有一个
QSqlRelationalTableModel
设置到另一个表,工作得很好。现在,我想在相关表上查找该行的其他列。我该如何实现这一点?
QSqlRelation
示例表:
到目前为止我所拥有的:
city ('id', 'name', 'state_id')
state ('id', 'name', 'capital')
这会给我一行像:
model = QtSql.QSqlRelationalTableModel()
model.setTable('city')
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name"))
model.select()
现在我想从状态模型中查找资本城市表。我该怎么做呢?我对
| 1 | 'San Francisco' | 'California' |
的理解是,它从 X 列的 main_table 中获取 id 并将其替换为映射列,但我不想更改状态表。我已经研究过
setRelation
和
QSqlRecord
,但我似乎遗漏了一些东西。
QSqlRelation
谢谢!
Thanks!
可以使用 QSqlRelationalTableModel 的
setData()
函数和 QSqlTableModel 的
record()
和
value()
函数来实现这一点。
以下是一个示例,说明如何在
city
模型中添加一个名为
capital
的新列,该列显示
state
模型中对应行的
capital
值:
import PyQt5.QtSql as QtSql
# ...(的现有代码)
# 获取状态模型
state_model = model.relationModel(2)
# 遍历城市模型中的每一行
for row in range(model.rowCount()):
# 获取状态 ID
state_id = model.data(model.index(row, 2)) # 2 是 state_id 列的索引
# 在状态模型中查找相应的行
state_model.setFilter(f"id = {state_id}")
state_model.select()
# 获取 capital 值
capital = state_model.record(0).value("capital") if state_model.rowCount() > 0 else ""
# 将 capital 值设置到城市模型的新列中
model.setData(model.index(row, model.columnCount()), capital)
# 添加新列标题
model.setHeaderData(model.columnCount() - 1, Qt.Horizontal, "Capital")
这段代码做了以下几件事:
-
获取状态模型:
使用
relationModel()
函数获取与state_id
列关联的状态模型。 - 遍历城市模型: 遍历城市模型中的每一行。
-
获取状态 ID:
获取当前行的
state_id
值。 -
查找状态行:
使用
setFilter()
函数在状态模型中找到具有匹配id
的行。 -
获取 capital 值:
使用
record()
和value()
函数从找到的状态行中获取capital
值。 -
设置 capital 值:
使用
setData()
函数将capital
值设置到城市模型的新列中。 -
添加列标题:
使用
setHeaderData()
函数为新列设置标题。
这将为的
city
模型添加一个名为
Capital
的新列,该列显示每个城市对应州的
capital
值。