首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新Qt QSqlRelationalTableModel中的外键

更新Qt QSqlRelationalTableModel中的外键
EN

Stack Overflow用户
提问于 2022-03-20 11:39:18
回答 1查看 110关注 0票数 1

我正在用python (PySide2)编写代码,但总体概念涉及Qt。这是我的两张桌子:

表“录音”:

代码语言:javascript
复制
| Column    | Type               |
| --------  | -------------------|
| id        | int (primary key)  |
| param1    | int                |
| param2    | int                |
| ...       | int                |
| paramN    | int                |

表"analyzed_recs":

代码语言:javascript
复制
| Column    | Type               |
| --------  | -------------------|
| id        | int (primary key)  |
| rec_id    | int (foreign key)  |  <-- Points to recordings.id
| paramN    | int                |

我需要在我的程序中显示param1param2。在Qt中,我使用了一个QSqlRelationalTable来实现这个目标:

代码语言:javascript
复制
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中的记录时

代码语言:javascript
复制
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特性可以实现这一点,但不幸的是,我错过了它。有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-04 17:46:46

我在使用PYQT时也遇到了同样的问题。调用record()方法返回的record对象没有名为“rec_id”的字段,因为QSqlRelationalTableModel用引用的字段名‘QSqlRelationalTableModel 1’来更改它。我们可以使用以下方法验证字段名:

代码语言:javascript
复制
fieldcount = record.count()
for i in range(fieldcount):
    logging.info("field %s %s", i, record.fieldName(i))

因此,我们需要在分配字段之前添加该字段:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71546401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档