Django查询以获取ArrayField列的所有不同值的计数

时间:2019-12-12 22:15:21

标签: django django-models django-rest-framework django-forms django-templates

对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}]

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. unnest()-postgress array function
  2. Django: Executing custom SQL directly

答案 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 )
  • 如果有人以非常有效的方式进行操作,请不要为该解决方案的简易版本提供答案。
相关问题