2016-04-05 8 views
0

のセットアップで、QSqlRelationの別のテーブルがうまく機能しています。今、関連するテーブルのその行の追加列を検索したいと思います。これをどのように達成するのですか?QSqlRelationalTableModel追加の関連する列

例テーブル:私はこれまで持っているもの

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を理解しているので、main_tableからX列のidを取り出し、それをマッピングされた列に置き換えますが、私は状態テーブルを変更したくありません。私はQSqlRecordQSqlRelationを調べましたが、私は何か不足しているようです。

ありがとうございます!

答えて

1

QSqlRelationalTableModelは、表示する表に外部キーがある場合に便利です。あなたの場合、capitalcityテーブルの列ではありません。

代わりに、QSqlQueryModelJOINの2つのテーブルを使用して、必要な列を取得する必要があります。このような何かは私がやって探しています何をすることが分かっ最良の方法は、QSqlRelationalTableModelを使用してselectStatementをオーバーライドすることである

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() 
+0

私はそれが事実になるのではないかと心配しました。残念ながら、QSqlQueryModelは読み込み専用で、私のアプリケーションは編集可能なモデル(キャピタルではありません)のため、私のためにはうまくいきません。 QSqlRelationalTableModelのsetRelation部分が現在と同じように機能するように、クエリをオーバーライドすることは可能でしょうか? –

0

動作するはずです。

失敗の試み:追加の列と

過負荷setRelation:

model.setRelation(2, QtSql.QSqlRelation("state", "id", "name, capital")) 

これはデータを表示しながら使用すると、1つを使用している場合、それは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結果セットの読み取り専用のデータモデルを提供して言う

しかしそれは正しい方向に私を指摘した。ありがとう

関連する問題