2016-04-05 5 views
0

Ich habe ein QSqlRelationalTableModel Setup mit einem QSqlRelation zu einem anderen Tisch funktioniert super. Jetzt möchte ich zusätzliche Spalten für diese Zeile in der verknüpften Tabelle suchen. Wie erreiche ich das?QSqlRelationalTableModel zusätzliche verwandte Spalten

Beispiel Tabellen:

city ('id', 'name', 'state_id') 
state ('id', 'name', 'capital') 

, was ich habe, so weit:

model = QtSql.QSqlRelationalTableModel() 
model.setTable('city') 
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name")) 
model.select() 

Was mir wie eine Zeile geben würde:

| 1 | 'San Francisco' | 'California' | 

Nun möchte Ich mag die Hauptstadt zum Nachschlagen im Staatsmodell, vom Stadttisch. Wie mache ich das? Mein Verständnis von setRelation ist, dass es die ID aus der main_table in Spalte X übernimmt und es durch die zugeordnete Spalte ersetzt, aber ich möchte die Zustandstabelle nicht ändern. Ich habe in die QSqlRecord und QSqlRelation geschaut, aber ich vermisse etwas.

Danke!

Antwort

1

QSqlRelationalTableModel ist nützlich, wenn Sie Fremdschlüssel in der Tabelle haben, die Sie anzeigen möchten. In Ihrem Fall ist capital keine Spalte der city Tabelle.

Sie sollten stattdessen eine QSqlQueryModel und JOIN die zwei Tabellen verwenden, um die Spalten zu nehmen, die Sie wünschen. So etwas sollte

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

Ich hatte Angst, dass das der Fall wäre. Leider funktioniert das nicht für mich, da QSqlQueryModel schreibgeschützt ist und meine Anwendung für ein editierbares Modell ist (kein Kapital). Wäre es möglich, die Abfrage so zu überschreiben, dass der setRelation-Teil von QSqlRelationalTableModel immer noch so funktioniert, wie er es derzeit tut? –

0
arbeiten

Der beste Weg, fand ich zu tun, was ich suche einen QSqlRelationalTableModel zu verwenden zu tun ist, und die Select außer Kraft setzen.

Fehlversuche:

Überlastung setRelation mit zusätzlichen Spalten:

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

Während diese die Daten anzeigt, ist es die QSqlRelationalDelegate bricht, wenn Sie eine verwenden.

Ich experimentierte auch mit einer Methode hinzugefügt, um die relationModel zu durchsuchen, aber das schien wie eine schlechtere Lösung als die selectStatement() -Ansatz.

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] 

Ich sah auch in QSqlQueryModel pro @ pnezis Rat, aber es sagt, in der Dokumentation bietet

Die QSqlQueryModel Klasse eine schreibgeschützte Datenmodell für Sätze SQL Ergebnis ...

Aber es wies mich in die richtige Richtung. Danke