如何使用从数据库获取的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
相关产品推荐
相关产品推荐

