Объект SQLAlchemy в модели PyQt QAbstractListItem возвращается как строка, а не как объект - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь вернуть объект SQLAlchemy, созданный с использованием класса Declarative_base, из PyQt5 QAbstractListModel. Возвращение из моей функции data () - это объект класса propper, но по какой-то причине он преобразуется в строку, и я не могу понять, как и почему.

Объект объекта Код предназначен для обработки / анализа и отображения информации из базы данных на основе выборок в PyQt GUI, например, демонстрации информации на основе выборки в QListView.

Вот выдержка из моего кода:

model.py (Моя модель данных SQLAlchemy)

Base = declarative_base(name='Base')

class Case(Base):
    __tablename__ = 'case'

    id = Column(Integer, primary_key=True)
    casenumber = Column(String(50), nullable=False, index=True, unique=True)
    reg_date = Column(DateTime)
    casetype = Column(Integer, ForeignKey('Casetype.id'))

class Casetype(Base):
    __tablename__ = 'casetype'

    id = Column(Integer, primary_key=True)
    casetype = Column(String(250), nullable=False)

model_adapter.py (Адаптеры модели данных PyQt)

class CaseListModel(QtCore.QAbstractListModel):

    def __init__(self, cases=[], parent=None):
        super(CaseListModel, self).__init__(parent)
        self.__cases = cases

    def rowCount(self, parent=QtCore.QModelIndex):
        return len(self.__saks)

    def data(self, index, role=QtCore.Qt.DisplayRole):

        if role == QtCore.Qt.DisplayRole:
            return self.__cases [index.row()].casenumber 
        elif role == QtCore.Qt.UserRole:
            return self.__cases [index.row()]
        else:
            return QtCore.QVariant()

gui .py (Мой графический интерфейс)

    def __init__(self, db_filename):

        super(Gui, self).__init__()
        uic.loadUi("main_gui.ui", self)

        self.db_engine = create_engine(f"sqlite:///{db_filename}")
        self.db_session_maker = sessionmaker()
        self.db_session = self.db_session_maker(bind=self.db_engine)

        # (...)

        self.cases_model = CaseListModel(self.db_session.query(Case).order_by(Case.casenumber).all())

        self.lboCasetype = self.findChild(QtWidgets.QLabel, "lboCasetype")

        # Connect model adapters to list views
        self.cases_listView = self.findChild(QtWidgets.QListView, "cases_listView")
        if self.cases_listView:
            self.cases_listView.setModel(self.cases_model )

            # Set the selection model for the cases_listView
            self.cases_listView_selectionModel = self.cases_listView.selectionModel()
            self.cases_listView_selectionModel.currentChanged.connect(self.case_select_change)

    def case_select_change(self, current, previous):
        if current.isValid():
            casetype_id = current.data(QtCore.Qt.UserRole).casetype
            casetype = self.db_session.query(Casetype.casetype).filter(Casetype.id.like(casetype_id)).first()[0]
            self.lboGjerningsdato.setText(f"{casetype}")


        # (...)

Проблема (насколько я знаю) заключается в функции case_select_change. casetype_id преобразуется из Casetype объекта в Str после возврата из CaseListModel.data, заставляя меня выполнить запрос для получения правильного значения для casetype. Это работает в этом упрощенном примере, но мне нужно иметь возможность работать с возвращаемым объектом (возвращением из curret.data(QtCore.Qt.UserRole).casetype) как Casetype -объектом. С какой стати это преобразуется после возвращения?

Мой подход здесь просто неправильный? Должен ли я делать все это по-другому?

...