使用Django ORM查询对jsondata>字段进行计数聚合

2024-05-01 22:05:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的模特

from jsonfield import JSONField
class data(model):
     content=JSONField()
     .......

对于模型数据,我的示例DB条目是

data1   : id =1, content = {"email":"abc@gmail.com"}
data2   : id =2, content = {"email":"cdf@gmail.com"}
data3   : id =3,  content ={"email":"abc@gmail.com"}
data4   : id = 4, content ={"email":"sfg@gmail.com"}
data5   : id = 5, content ={"email":"abc@gmail.com"}
data6   : id = 6, content ={"email":"sfg@gmail.com"}

我需要找到非唯一的“email”值和id列表,比如

"abc@gmail.com"  :  [1,3,5]
"sfg@gmail.com   :  [4,6]

我使用的是django1.11、python2.7和postgres9.3

我的问题是

lists = data.objects.filter(....).extra(select={'email':"content->>'email'"}).values('email','id')

我得到的结果是

{"email":"abc@gmail.com","id":1}
{"email":"cdf@gmail.com","id":2}
{"email":"abc@gmail.com","id":3}
{"email":"sfg@gmail.com","id":4}
{"email":"abc@gmail.com","id":5}
{"email":"sfg@gmail.com","id":6}

包括唯一值和非唯一值,这不是必需的。你知道吗

查询1:是否可以使用Django只查询JSON字段中的唯一值。你知道吗

尝试了distinct(),但由于值部分中的'id'和'email'都失败了

不管怎么说,我们把它作为

for d in lists:
    if d['email'] not in temp:
        temp[d['email']]=[d['id']]
    else:
        temp[d['email']].append(d['id'])

得到所有值的结果,包括唯一值和非唯一值,如下所示

"abc@gmail.com"  :  [1,3,5]
"sfg@gmail.com"  :  [4,6]
"cdf@gmail.com"  :  [2] ## not desired

查询2:是否有任何方法可以更有效地处理这些数据?你知道吗


Tags: 数据incomiddataemailnotcontent
1条回答
网友
1楼 · 发布于 2024-05-01 22:05:35

对于postgresqldjango>;=1.9可以尝试ArrayAgg。你的问题可能是这样的

lists = data.objects.filter(....).extra(select={'email':"content->>'email'"}).values('email','id').aggregate(list=ArrayAgg('id'))

相关问题 更多 >