Не обновляются данные в двух связанных QTableView, модели которых реализованы через QsqlRelationalTableModel

Проблема в обновлении таблицы "сотрудники", а именно столбца "организации", связанного с таблицей "организации". нашел примерное решение, однако не могу адаптировать это на питоновский лад, слаб в с++

введите сюда описание изображения

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5.QtCore import *
import sys, sqlite3

conn = sqlite3.connect('db')
cursor = conn.cursor()


class CreateTable():
    def createTableStaff(self):
        try:
            cursor.execute("""
            CREATE TABLE staff (
            staff_id INTEGER PRIMARY KEY AUTOINCREMENT,
            staff_name TEXT,
            staff_surname TEXT,
            staff_age INTEGER,
            staff_pos TEXT,
            staff_org INTEGER,
            FOREIGN KEY (staff_org) REFERENCES org (org_id)
            )
            """)
        except Exception as ex:
            print(ex)

    def createTableOrg(self):
        try:
            cursor.execute("""
            CREATE TABLE org (
            org_id INTEGER PRIMARY KEY AUTOINCREMENT,
            org_name TEXT,
            org_addr TEXT,
            org_phone TEXT
            )
            """)
        except Exception as ex:
            print(ex)
table = CreateTable()
#table.createTableStaff()
#table.createTableOrg()


class Organization(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.btn_add_record = QPushButton('Добавить запись')
        self.btn_del_record = QPushButton('Удалить запись')

        self.srtm_org = QSqlRelationalTableModel()
        self.srtm_org.setTable('org')
        self.srtm_org.setHeaderData(1, Qt.Horizontal, 'Наименование')
        self.srtm_org.setHeaderData(2, Qt.Horizontal, 'Адрес')
        self.srtm_org.setHeaderData(3, Qt.Horizontal, 'Контакты')

        self.table_org = QTableView()
        self.table_org.setModel(self.srtm_org)
        self.table_org.hideColumn(0)
        self.table_org.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.srtm_org.select()

        hbox_btn = QHBoxLayout()
        hbox_btn.addWidget(self.btn_add_record)
        hbox_btn.addWidget(self.btn_del_record)
        vbox_main = QVBoxLayout()
        vbox_main.addLayout(hbox_btn)
        vbox_main.addWidget(self.table_org)
        self.setLayout(vbox_main)
        #Signals
        self.btn_add_record.clicked.connect(self.on_add_record)
        self.btn_del_record.clicked.connect(self.on_del_record)
        self.srtm_org.dataChanged.connect(self.on_data_change)

    def on_add_record(self):
        self.srtm_org.insertRow(0)
        pass

    def on_del_record(self):
        self.srtm_org.removeRow(self.table_org.currentIndex().row())
        self.srtm_org.select()

    def on_data_change(self):
        self.srtm_org.submitAll()
        self.table_org.update()

class Staff(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.btn_add_record = QPushButton('Добавить запись')
        self.btn_del_record = QPushButton('Удалить запись')

        self.srtm_staff = QSqlRelationalTableModel()
        self.srtm_staff.setTable('staff')
        self.srtm_staff.setHeaderData(1,Qt.Horizontal, 'Имя')
        self.srtm_staff.setHeaderData(2,Qt.Horizontal, 'Фамилия')
        self.srtm_staff.setHeaderData(3,Qt.Horizontal, 'Возраст')
        self.srtm_staff.setHeaderData(4, Qt.Horizontal, 'Должность')
        self.srtm_staff.setHeaderData(5, Qt.Horizontal, 'Организация')
        self.srtm_staff.setRelation(5, QSqlRelation('org', 'org_id', 'org_name'))
        self.srtm_staff.setJoinMode(QSqlRelationalTableModel.LeftJoin)

        self.table_staff = QTableView()
        self.table_staff.setModel(self.srtm_staff)
        self.table_staff.hideColumn(0)
        self.table_staff.setItemDelegateForColumn(5, QSqlRelationalDelegate(self.table_staff))
        self.table_staff.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.srtm_staff.select()

        hbox_btn = QHBoxLayout()
        hbox_btn.addWidget(self.btn_add_record)
        hbox_btn.addWidget(self.btn_del_record)
        vbox_main = QVBoxLayout()
        vbox_main.addLayout(hbox_btn)
        vbox_main.addWidget(self.table_staff)
        self.setLayout(vbox_main)
        #Signals
        self.btn_add_record.clicked.connect(self.on_add_record)
        self.btn_del_record.clicked.connect(self.on_del_record)
        self.srtm_staff.dataChanged.connect(self.on_data_change)




    def on_add_record(self):
        self.srtm_staff.insertRow(0)
        pass

    def on_del_record(self):
        self.srtm_staff.removeRow(self.table_staff.currentIndex().row())
        self.srtm_staff.select()

    def on_data_change(self):
        self.srtm_staff.submitAll()
        self.table_staff.update()


class Org_and_Staff(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self,parent)
        lbl_staff =QLabel('Сотрудники')
        lbl_staff.setAlignment(Qt.AlignCenter)
        lbl_staff.setFont(QFont('Monospace',15))
        lbl_org = QLabel('Организации')
        lbl_org.setAlignment(Qt.AlignCenter)
        lbl_org.setFont(QFont('Monospace', 15))
        staff = Staff()
        organization = Organization()

        vbox_main = QVBoxLayout()
        vbox_main.addWidget(lbl_org)
        vbox_main.addWidget(organization)
        vbox_main.addWidget(lbl_staff)
        vbox_main.addWidget(staff)
        self.setLayout(vbox_main)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    database = QSqlDatabase.addDatabase('QSQLITE')
    database.setDatabaseName('db')
    database.open()
    tables = Org_and_Staff()
    tables.resize(1000, 800)
    tables.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: Никита Солоницын

Чуть разобравшись, смог переделать

class UpdateRelModel():
    def __init__(self, srtModel):
        self.relColumnIndices = []
        self.srtModel = srtModel

    def setRelation(self, column, relation):
        self.relColumnIndices.append(column)
        self.srtModel.setRelation(column, relation)

    def updateRelations(self):
        for column in self.relColumnIndices:
            self.srtModel.relationModel(column).select()


class Staff(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.btn_add_record = QPushButton('Добавить запись')
        self.btn_del_record = QPushButton('Удалить запись')

        self.srtm_staff = QSqlRelationalTableModel()
        self.srtm_staff.setTable('staff')
        self.srtm_staff.setHeaderData(1, Qt.Horizontal, 'Имя')
        self.srtm_staff.setHeaderData(2, Qt.Horizontal, 'Фамилия')
        self.srtm_staff.setHeaderData(3, Qt.Horizontal, 'Возраст')
        self.srtm_staff.setHeaderData(4, Qt.Horizontal, 'Должность')
        self.srtm_staff.setHeaderData(5, Qt.Horizontal, 'Организация')
        self.srtm_staff.setJoinMode(QSqlRelationalTableModel.LeftJoin)

        self.myRelModel = UpdateRelModel(self.srtm_staff) 
        self.myRelModel.setRelation(5, QSqlRelation('org', 'org_id', 'org_name'))


        self.table_staff = QTableView()
        self.table_staff.setModel(self.srtm_staff)
        self.table_staff.hideColumn(0)
        self.table_staff.setItemDelegateForColumn(5, QSqlRelationalDelegate(self.table_staff))
        self.table_staff.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.srtm_staff.select()

        hbox_btn = QHBoxLayout()
        hbox_btn.addWidget(self.btn_add_record)
        hbox_btn.addWidget(self.btn_del_record)
        vbox_main = QVBoxLayout()
        vbox_main.addLayout(hbox_btn)
        vbox_main.addWidget(self.table_staff)
        self.setLayout(vbox_main)
        # Signals
        self.btn_add_record.clicked.connect(self.on_add_record)
        self.btn_del_record.clicked.connect(self.on_del_record)
        self.srtm_staff.dataChanged.connect(self.on_data_change)
        self.table_staff.clicked.connect(self.updateTable)

    def on_add_record(self):
        self.srtm_staff.insertRow(0)
        pass

    def on_del_record(self):
        self.srtm_staff.removeRow(self.table_staff.currentIndex().row())
        self.srtm_staff.select()

    def updateTable(self):
        self.myRelModel.updateRelations()

    def on_data_change(self):
        self.srtm_staff.submitAll()
        #self.table_staff.update()
→ Ссылка