Вставить строку в 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"))

Немного хакерское решение (и раздражающие избыточные значения в таблице базы данных), но теперь оно работает отлично.

Другие вопросы по тегам