You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用从数据库获取的id字段对MDDataTable进行排序?

实现MDDataTable按隐藏id排序的方法

先修正现有代码的问题

你当前的写法存在两个明显问题:

  • 分5次查询同一张表的不同字段,查询效率极低,且后续拼接行数据极易出现顺序错乱
  • row_data的赋值逻辑错误,fetchall()返回的是所有符合条件行的对应字段集合,你现在的写法会把整列的所有值塞进同一个单元格,完全不符合MDDataTable的行数据结构

方案1:SQL层面直接按id排序(最简单,适合不需要前端动态切换排序规则的场景)

直接一次查询所有需要的字段,同时在SQL语句里加ORDER BY idObjecten(升序)或者ORDER BY idObjecten DESC(降序)即可,你不需要把id字段放到column_data里展示,只需要查询的时候拿到,排序后只取需要展示的字段组装行数据即可。

修改后的代码如下:

def build1(self, username):
    screen = Builder.load_string(screen_helper)
    # 一次查询所有需要的字段,包含id,直接在数据库层面完成排序
    sql = """
    SELECT LoggedInUser, ObjectName, Certainty, TimeOfDetection, idObjecten 
    FROM ID191774_6itn1project7.DetectedObjects 
    WHERE LoggedInUser = %s 
    ORDER BY idObjecten ASC
    """
    # 注意参数元组只有一个元素时要加逗号,否则会被识别为字符串而非元组
    mycursor.execute(sql, (username,))
    all_rows = mycursor.fetchall()
    
    # 组装行数据,只取前4个需要展示的字段即可,id只用来排序不需要放到行数据里
    row_data = []
    for row in all_rows:
        row_data.append(
            (row[0], row[1], row[2], row[3])
        )

    self.data_tables = MDDataTable(
        size_hint=(0.9, 0.6),
        use_pagination=True,
        rows_num=10,
        column_data=[
            ("User", dp(30)),
            ("Object", dp(30)),
            ("Certainty", dp(30)),
            ("Time", dp(30)),
        ],
        row_data=row_data,
    )
    return screen

方案2:前端动态按id排序(适合需要前端触发排序切换的场景)

如果你需要在前端通过点击按钮等方式动态切换按id升/降序,你可以把id和对应行数据绑定存储:

  • 定义一个类属性self.row_id_map,存储id和对应行数据的映射关系
  • 触发排序时,先把所有行按关联的id排序,再重新赋值给self.data_tables.row_data即可刷新表格展示

内容的提问来源于stack exchange,提问作者voiture

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 06:24:04