Я пытаюсь вернуть объект 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
-объектом. С какой стати это преобразуется после возвращения?
Мой подход здесь просто неправильный? Должен ли я делать все это по-другому?