如何从 SQL 模型中为连接到它的 QListView 选择行

Posted

技术标签:

【中文标题】如何从 SQL 模型中为连接到它的 QListView 选择行【英文标题】:How to select rows from an SQL model for a QListView connected to it 【发布时间】:2010-07-06 22:30:45 【问题描述】:

我正在 PyQt4 中尝试以下操作,使用 SQLAlchemy 作为 QListView 模型的后端。

我的第一个版本是这样的:

class Model(QAbstractListModel):
     def __init__(self,  parent=None,  *args):
        super(Model,  self).__init__(parent,  *args)

     def data(self,  index,  role):
        if not index.isValid():
            return None

        if role == QtCore.Qt.DisplayRole:
            d = sqlmodel.q.get(index.row()+1)
            if d:
                return d.data
        return None

问题是,一旦我开始删除行,ID 就不再连续。 所以我目前的解决方案是这样的:

class Model(QAbstractListModel):
     def __init__(self,  parent=None,  *args):
        super(Model,  self).__init__(parent,  *args)

     def data(self,  index,  role):
        if not index.isValid():
            return None

        if role == QtCore.Qt.DisplayRole:
            dives = Dive.q.all()
            if index.row() >= len(dives) or index.row() < 0:
                return None
            return dives[index.row()].location

但我想这样,我以后可能会遇到从数据库中选择正确条目的问题。

有什么优雅的方法可以做到这一点吗? 我的第一个想法是将数据库中的最大 id 作为 row_count 返回,然后用虚假数据填充不存在的行并将它们隐藏在视图中。由于应用程序最多必须处理 10k 左右的数据,而这已经非常不太可能,我认为这可能是可行的。

【问题讨论】:

如何删除行?只是在模型之外(所以它们没有显示出来),还是也在数据库之外? 数据库外。但正如我上面所说,从模型中删除它们可能是一个想法 如果我的问题不够清楚,请随时询问更多细节。谢谢大家。 【参考方案1】:

将行 ID 存储在模型的列表中,并将其用作检索数据库行的索引。如果您想在模型视图系统中实现排序,只需按要求对列表进行排序即可。

如果您直接从数据库中删除一行,模型将不知道,因此它不会更新视图。当用户尝试编辑基础数据库中不再存在的行时,它们将显示陈旧的数据,并且可能还会破坏某些内容,这可能会变得非常糟糕。每当您这样做以刷新所有视图时,您都可以通过在模型上调用 reset() 来解决此问题。

class Model(QAbstractListModel):
     def __init__(self,  parent=None,  *args):
        super(Model,  self).__init__(parent,  *args)
        self.id_list = []

     def data(self,  index,  role):
        if not index.isValid():
            return None

        row_id = self.id_list[index.row()]

        if role == QtCore.Qt.DisplayRole:
            # query database to retrieve the row with the given row_id

【讨论】:

以上是关于如何从 SQL 模型中为连接到它的 QListView 选择行的主要内容,如果未能解决你的问题,请参考以下文章

Azure 为连接到 CosmosDB 的标准逻辑应用生成 URL

如何在 Django 中为用户模型加载 sql 夹具?

将输入类型连接到模型并在asp net中为它们分配一个值[重复]

如何从 django 模型中为模型字段定义 json 类型

如何在查询中为 eloquent 模型起别名

如何从 Flutter 的列表中为模型类赋值? [复制]