Django Query 获取 ArrayField 列的所有不同值的计数

Posted

技术标签:

【中文标题】Django Query 获取 ArrayField 列的所有不同值的计数【英文标题】:Django Query to get count of all distinct values for column of ArrayField 【发布时间】:2020-04-06 08:51:45 【问题描述】:

计算 ArrayField 列的所有不同值的最有效方法是什么。 假设我有一个名为 MyModelcities 字段的模型,即 postgres.ArrayField。

#models.py
class MyModel(models.Model):
     ....
     cities = ArrayField(models.TextField(blank=True),blank=True,null=True,default=list) ### ['mumbai','london']

假设我们的 MyModel 有以下 3 个对象,cities 字段值如下。

1. ['london','newyork']
2. ['mumbai']
3. ['london','chennai','mumbai']

cities 字段的不同值进行计数是对整个列表进行计数,而不是对每个元素进行计数。
## Query
MyModel.objects.values('cities').annotate(Count('id')).order_by().filter(id__count__gt=0)

在这里,我想计算cities 字段列表的每个元素上cities 字段的不同值。这应该会给出以下最终输出。
['london':2,'newyork':1,'chennai':1,'mumbai':2]

【问题讨论】:

【参考方案1】:

在数据库级别本身执行 group by 操作

from django.db import connection

cursor = connection.cursor()
raw_query = """
select unnest(subquery_alias.cities) as distinct_cities, count(*) as cities_group_by_count
    from (select cities from sample_mymodel) as subquery_alias group by distinct_cities;
"""

cursor.execute(raw_query)
result = ["city": row[0], "count": row[1] for row in cursor]
print(result)

参考文献

    unnest()-postgress array function Django: Executing custom SQL directly

【讨论】:

【参考方案2】:

使用 Django 教学大纲的低效方法:

    unique_cities = list(data.values_list('cities',flat=True))
    unique_cities_compiled = list(itertools.chain.from_iterable(unique_cities ))
    unique_cities_final = unique_cities_compiled .count(i) for i in unique_cities_compiled 
    print(unique_cities_final )
'london':2,'newyork':1,'chennai':1,'mumbai':2
如果有人以非常有效的方式这样做,请放弃即兴解决方案的答案。

【讨论】:

以上是关于Django Query 获取 ArrayField 列的所有不同值的计数的主要内容,如果未能解决你的问题,请参考以下文章

检查 Django 生成的查询

如何在 django rest 框架中访问获取请求数据

django 获取查询字符串的参数

模仿django实现一个后台管理

Django 1.2 等价于 QuerySet.query.as_sql()

Django 模板:在同一模板中访问 query_set 和 non-query_set 结果