【问题标题】:Django Query to get count of all distinct values for column of ArrayFieldDjango Query 获取 ArrayField 列的所有不同值的计数
【发布时间】:2023-03-07 15:40:02
【问题描述】:

计算 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}]

【问题讨论】:

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


    【解决方案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)

    参考文献

    1. unnest()-postgress array function
    2. 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}
      
      • 如果有人以非常有效的方式这样做,请放弃即兴解决方案的答案。

      【讨论】:

        猜你喜欢
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多