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 列的所有不同值的最有效方法是什么。
假设我有一个名为 MyModel
和 cities
字段的模型,即 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 列的所有不同值的计数的主要内容,如果未能解决你的问题,请参考以下文章