'PyQT Adding a record to QSqlRelationalTableModel

I am trying to create a new record in QTableView thats based on a QSqlRelationalTableModel. The record gets added but the field with the foreign key relationship doesn't get set, it has NULL. Then when the QTableView is refreshed the new record doesn't display, but its in the database. I can manually set the value using a Database browser, and it will the successfully display.

class CharacterModel:

    def __init__(self, show_id = 1):
        self.model = self._createModel(show_id)

    @staticmethod
    def _createModel(show_id):
        tableModel = QSqlRelationalTableModel()
        tableModel.setTable("Character")
        tableModel.setFilter(f"show_id = {show_id}")
        tableModel.setEditStrategy(QSqlTableModel.OnFieldChange)
        tableModel.setRelation(5, QSqlRelation("Character_Type", "type_id", "name"))
        tableModel.select()

        for column, header in enumerate(CharacterFields):
            tableModel.setHeaderData(column, Qt.Horizontal, header)

        return tableModel

    def addCharacter(self, show_id, characterData):
        newrecord = self.model.record()
        newrecord.setGenerated("character_id", True)
        newrecord.setValue("show_id", int(show_id))
        newrecord.setValue("name", characterData[0])
        newrecord.setValue("short_name", characterData[1])
        newrecord.setValue("description", characterData[2])
        newrecord.setValue("type_id", characterData[3])
        row = self.model.rowCount()
        self.model.insertRecord(row, newrecord)

In the above code 'type_id' is the foreign key field and 'characterData[3]' is definately an integer (i have tried int()).

This is how the table is created...

CREATE TABLE 'Character' (
  'character_id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  'show_id' INTEGER NOT NULL DEFAULT NULL,
  'name' MEDIUMTEXT NOT NULL DEFAULT NULL,
  'short_name' MEDIUMTEXT DEFAULT NULL,
  'description' MEDIUMTEXT DEFAULT NULL,
  'type_id' INTEGER DEFAULT NULL,
  FOREIGN KEY (type_id) REFERENCES 'Character_Type' ('type_id')
);

I am doing the exact same thing as PYQT Add new record using QSqlRelationalTableModel and QtableView

There are no constraints on the field, both On Delete and On Update are set to No Action.

I have the same code working for QSqlTableModel, and it works great, the only difference is QSqlRelationalTableModel.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source