Вставить строку в QSqlRelationalTableModel при отображении двух столбцов для внешнего ключа
У меня есть две таблицы SQLite, имеющие следующую структуру:
CREATE TABLE "log" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"value" INTEGER NOT NULL,
"category_id" INTEGER NOT NULL,
"date" TEXT NOT NULL,
FOREIGN KEY("category_id") REFERENCES "category"("id")
);
CREATE TABLE "category" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"category_name" TEXT NOT NULL,
"type" TEXT NOT NULL
);
Я также хочу отобразить QTableView
который использует QSqlRelationalTableModel
. Мне нужно отобразить два столбца (category_name
а также type
) вместо того category_id
, хотя QSqlRelation, похоже, заменяет внешний ключ только одним столбцом, мне удалось показать 2 столбца, например:
self.balance_table_model = QSqlRelationalTableModel()
self.balance_table_model.setTable("log")
self.balance_table_model.setRelation(3, QSqlRelation("category", "id", "category_name, type"))
self.balance_table_model.setHeaderData(1, Qt.Horizontal, "Name")
self.balance_table_model.setHeaderData(2, Qt.Horizontal, "Value")
self.balance_table_model.setHeaderData(3, Qt.Horizontal, "Category")
self.balance_table_model.setHeaderData(4, Qt.Horizontal, "Type")
self.balance_table_model.setHeaderData(5, Qt.Horizontal, "Date")
self._ui.balanceTableView.setModel(self.balance_table_model)
self._ui.balanceTableView.setColumnHidden(0, True)
Теперь, когда я хочу добавить новую строку, вставка работает только в том случае, если я присоединяю две таблицы без типа, т.е.
self.balance_table_model.setRelation(3, QSqlRelation("category", "id", "category_name"))
Код вставки:
record = self.balance_table_model.record()
record.setGenerated(0, True)
record.setValue(1, log_name)
record.setValue(2, log_value)
record.setValue(3, category_id)
record.setValue(4, date)
self.balance_table_model.insertRecord(-1, record)
Как заставить вставку работать, не теряя возможности отображать type
столбец?
1 ответ
Столкнулся с точно такой же проблемой. К сожалению, Qt не поддерживает несколько столбцов, поэтому нам нужно просто установить отношение один к одному для каждого столбца:
self.balance_table_model.setRelation(3, QSqlRelation("category", "id", "category_name"))
Источник: https://forum.qt.io/topic/139659/how-to-insert-data-into-a-qsqlrelationaltablemodel .
РЕДАКТИРОВАТЬ: у меня был похожий пример:
create_table_query.exec(
"""CREATE TABLE "appointments" (
"appt_id" INTEGER,
"patient_id" INTEGER,
"patient_fname_id" INTEGER,
"patient_lname_id" INTEGER,
"scheduled_date" TEXT,
"scheduled_time" TEXT,
"scheduled_duration" INTEGER,
"reason" TEXT,
"appt_notes" TEXT,
PRIMARY KEY("appt_id"),
FOREIGN KEY("patient_id") REFERENCES "patient_profile"("patient_id")
)
""")
затем я установил
"patient_id" INTEGER,
"patient_fname_id" INTEGER,
"patient_lname_id" INTEGER,
Все со значением «patient_id» в моем представлении QWidget, поэтому средняя запись в базе данных будет выглядеть так:здесь
Моя модель и отношения были такими:
class ApptTableModel(QSqlRelationalTableModel):
def __init__(self):
super().__init__()
self.setTable('appointments')
self.setRelation(1, QSqlRelation("patient_profile", "patient_id", "patient_id"))
self.setRelation(2, QSqlRelation("patient_profile", "patient_id", "name_fname"))
self.setRelation(3, QSqlRelation("patient_profile", "patient_id", "name_lname"))
Немного хакерское решение (и раздражающие избыточные значения в таблице базы данных), но теперь оно работает отлично.