QSqlRelationalTableModel附加相关列

时间:2016-04-05 21:06:37

标签: python qt sqlite pyqt pyside

我有一个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并将其替换为映射列,但我不想改变状态表。我已查看了QSqlRecordQSqlRelation,但我似乎错过了一些内容。

谢谢!

2 个答案:

答案 0 :(得分:1)

当您想要显示的表中有外键时,

QSqlRelationalTableModel非常有用。在您的情况下,capital不是city表的列。

您应该使用QSqlQueryModelJOIN这两个表来获取您想要的列。这样的事情应该有效

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结果集提供了只读数据模型......

但它指出了我正确的方向。感谢