0

我正在尝试在基于 QSqlRelationalTableModel 的 QTableView 中创建新记录。记录已添加,但具有外键关系的字段未设置,它具有 NULL。然后当 QTableView 刷新时,新记录不会显示,但它在数据库中。我可以使用数据库浏览器手动设置该值,它将成功显示。

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)

在上面的代码中,'type_id' 是外键字段,'characterData[3]' 肯定是一个整数(我尝试过 int())。

这就是创建表的方式...

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')
);

我正在做与 PYQT 完全相同的事情使用 QSqlRelationalTableModel 和 QtableView 添加新记录

该字段没有任何限制,“删除时”和“更新时”都设置为“无操作”。

我为 QSqlTableModel 工作的代码相同,而且效果很好,唯一的区别是 QSqlRelationalTableModel。

4

0 回答 0