我有一个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' |
现在我想从城市表中查找州模型中的资本。我该怎么做呢?我对setRelation
的理解是,它从第X列的main_table中获取id并将其替换为映射列,但我不想改变状态表。我已查看了QSqlRecord
和QSqlRelation
,但我似乎错过了一些内容。
谢谢!
答案 0 :(得分:1)
QSqlRelationalTableModel
非常有用。在您的情况下,capital
不是city
表的列。
您应该使用QSqlQueryModel
和JOIN
这两个表来获取您想要的列。这样的事情应该有效
model = QtSql.QSqlQueryModel()
model.setQuery("SELECT city.id, city.name, state.name, state.capital FROM city "
"INNER JOIN state ON city.state_id = state.id");
model.select()
答案 1 :(得分:0)
我发现做我想要做的最好的方法是使用QSqlRelationalTableModel并覆盖selectStatement。
尝试失败:
使用其他列重载setRelation:
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name, capital"))
虽然这会显示数据,但如果您使用的话,它会破坏QSqlRelationalDelegate。
我还尝试添加了一种搜索relationModel的方法,但这似乎比selectStatement()方法更糟糕。
def getStateForRow(self, row):
# The state is col 2
stateModel=self.relationModel(2)
return stateModel.match(stateModel.index(0,1), QtCore.Qt.DisplayRole, self.record(row).value(2), flags = QtCore.Qt.MatchExactly)[0]
我还根据@ pnezis的建议调查了QSqlQueryModel,但它在文档中说明
QSqlQueryModel类为SQL结果集提供了只读数据模型......
但它指出了我正确的方向。感谢