Skip to main content
 首页 » 编程设计

python之格式化 Django QuerySet 以将值输出为数组

2024年08月19日34Renyi-Fan

我的表中有如下所示的数据:

src_id, dst_id, params 
int   , int   , array 

我正在查询数据以从数组中提取一些值 使用以下 Django 查询

dataset = query_set.values_list('src_id', 'dst_id', *[e.field for e in settings])

我需要这样输出数据:

[ 
[1,2,[a,b,c,d]], 
[3,4,[a,c,d,e]], 
... 
] 

但是 values_list 返回一个元组列表,例如 (1,2,a,b,c,d)(3,4,a,c,d,e)...

所以我一直在执行以下操作以将元组值重新组合到一个数组中:

[[d[0], d[1], d[2:]] for d in dataset] 

它工作正常,但我有 1M+ 行,而且速度很慢。它还使用了大量内存。理想情况下,我想在 SQL 中正确格式化数据(通过 Django)并将输出直接推送到 JSON 序列化程序,而无需生成中间数组。

有没有办法优化这段代码?

我看过使用循环或 lambda,但这并没有太大区别。我查看了 array 的使用,但它只接受基本类型,所以数组的数组不太好运。

我正在寻找一种方法来查询数据库并以正确的格式直接输出数据,如果可能的话在 Django 中:

我看到 Django 可以像这样进行切片数组查找

dataset = query_set.values_list('src_id', 'dst_id', 'data__3_10')

例如获取索引 3 和 10 之间的值,但我需要检索特定索引(例如 1、4、5、6、8、11),而不是切片。

关于如何格式化查询输出的任何提示? 有可能吗,或者对 Django 来说太深奥了? 为此,我需要 raw SQL 吗?

谢谢

请您参考如下方法:

如果数据库是PostgreSQL 或Oracle 那么Django 1.11 中的内存需求可以通过iterator() 显着降低。适用于任何查询集的方法,包括 values() 或 values_list() 查询集。然后默认使用服务器端游标,而无需在 Django 或数据库驱动程序中进行任何缓存。阅读文档中的详细信息。

演示

qs = query_set.values_list('src_id', 'dst_id', 'data') 
for row in qs.iterator(): 
    print(row)  

输出

(3, 4, ['a', 'c', 'd', 'e']) 
... 

完整的例子

qs = query_set.values_list('src_id', 'dst_id', 'data') 
with open(..., 'w') as f: 
    f.write('[\n') 
    for src_id, dst_id, data in qs.iterator(): 
        str_sub_array = ','.join(data[x] for x in column_settings) 
        f.write('[{},{},[{}]],\n'.format(src_id, dst_id, str_sub_array) 
    f.write(']\n') 

内存需求可以忽略不计。