PyQt5: QSqlRelationalTableModel заполнить данные с помощью модели SqlAlchemy? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать подкласс QSqlRelationalTableModel для работы с SQLAlchemy, у меня возникают проблемы при настройке данных.

Я пытаюсь переопределить метод setData , однако я неуверен, как это сделать.пока мой класс выглядит так:

import sys
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy as sa
from sqlalchemy.orm import class_mapper

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtSql import QSqlTableModel, QSqlRelationalTableModel
from PyQt5.Qt import QVariant, Qt

base = declarative_base()

class SqlAlchemyTableRelationalModel(QSqlRelationalTableModel):
    def __init__(self, session, model):
        super().__init__()
        self.model = model
        self.session = session
        self.refresh()

    def refresh(self):
        self.layoutAboutToBeChanged.emit()
        self.data = self.session.query(self.model).all()
        self.count = len(self.data)
        self.columns = attribute_names(self.model)
        self.layoutChanged.emit()

    def rowCount(self, parent):
        '''Overrides QSqlTableModel rowCount
        '''
        return self.count or 0

    def setTable(self):
        return self.model.__tablename__

Например, если я тестирую с простым User классом,

class User(base):
    __tablename__ = "users"
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.String(50))

    def __repr__(self):
        return f"<User(id={self.id}, name={self.name})>"

с некоторыми тестовыми данными,

if __name__ == "__main__":
    engine = sa.create_engine("sqlite:///my_db.db", echo='debug')
    base.metadata.create_all(engine)

    DBsession = sa.orm.sessionmaker(bind=engine)
    session = DBsession()

    # pop some dummy data
    if not session.query(User).count():
        session.add(User(name="Albert"))
        session.add(User(name="Frankie"))
        session.add(User(name="Grace"))
        session.commit()

    model = SqlAlchemyTableRelationalModel(session, User)


    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QWidget()
    table = QtWidgets.QTableView(window)
    table.setModel(model)
    window.show()
    sys.exit(app.exec_())

Получаю,

currently looks like

...