我正在用python (PySide2)编写代码,但总体概念涉及Qt。这是我的两张桌子:
表“录音”:
| Column | Type |
| -------- | -------------------|
| id | int (primary key) |
| param1 | int |
| param2 | int |
| ... | int |
| paramN | int |表"analyzed_recs":
| Column | Type |
| -------- | -------------------|
| id | int (primary key) |
| rec_id | int (foreign key) | <-- Points to recordings.id
| paramN | int |我需要在我的程序中显示param1和param2。在Qt中,我使用了一个QSqlRelationalTable来实现这个目标:
def _init_db_models(self):
self.analyzed_recs_sql_model = QSqlTableModel(self, self.db)
self.analyzed_recs_sql_model.setTable("analyzed_recs")
rec_id = self.analyzed_recs_sql_model.fieldIndex('rec_id')
self.analyzed_recs_sql_model.setRelation(rec_id, QSqlRelation("recordings", "id", "param1"))
self.analyzed_recs_sql_model.setRelation(rec_id, QSqlRelation("recordings", "id", "param2"))
self.analyzed_recs_sql_model.select()
self.analyzed_data_table.setModel(self.analyzed_recs_sql_model)这段代码可以很好地显示所需的字段。
但是,当要更新analyzed_recs中的记录时
record = self.analyzed_recs_sql_model.record()
record.remove(record.indexOf("id"))
record.setValue("rec_id", self.current_rec_id)
record.setValue("param1", self.param1)
record.setValue("param2", param2)
self.analyzed_recs_sql_model.insertRecord(-1, record)
self.analyzed_recs_sql_model.submitAll()没有将列rec_id设置为(NULL)到表中(其他参数正确地插入到表中)。相反,如果我避免使用QSqlRelationalTableModel而改用QSqlTableModel,则插入将正确执行(正如我所期望的),但我失去了内部联接显示功能。
我的想法是创建两个不同的模型,一个QSqlRelationalTableModel只用于显示,一个QSqlTableModel仅用于编辑数据。但是,我不喜欢同步这两者的额外工作量。
我确信有一个Qt特性可以实现这一点,但不幸的是,我错过了它。有什么建议吗?
发布于 2022-06-04 17:46:46
我在使用PYQT时也遇到了同样的问题。调用record()方法返回的record对象没有名为“rec_id”的字段,因为QSqlRelationalTableModel用引用的字段名‘QSqlRelationalTableModel 1’来更改它。我们可以使用以下方法验证字段名:
fieldcount = record.count()
for i in range(fieldcount):
logging.info("field %s %s", i, record.fieldName(i))因此,我们需要在分配字段之前添加该字段:
record = self.analyzed_recs_sql_model.record()
record.remove(record.indexOf("id"))
record.append(QSqlField("rec_id"))
record.setValue("rec_id", self.current_rec_id)https://stackoverflow.com/questions/71546401
复制相似问题