对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}]
答案 0 :(得分:2)
通过在数据库级别本身中的操作来执行 组 。
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)
答案 1 :(得分:0)
以低效率的方式从Django教学大纲中进行操作:
<div class="col-12">
<input type="checkbox" id="demo-copy" name="demo-copy">
<label for="demo-copy">show password</label>
</div>
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 )