我正在尝试在基于 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。