Вставить строку в QSqlRelationalTableModel при отображении двух столбцов для внешнего ключа - PullRequest
3 голосов
/ 18 апреля 2020

У меня есть две таблицы 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?

...