【问题标题】:Counting distinct elements in Django ArrayField计算 Django ArrayField 中的不同元素
【发布时间】:2020-08-01 16:21:09
【问题描述】:

我有一个由

定义的模型
from django.contrib.postgres.fields import ArrayField

class Model(models.Model):
    name = models.CharField(max_length=255)
    tags = ArrayField(models.CharField(max_length=255))

我想要一种方法来有效地获取标签 ArrayField 中每个不同元素的计数。我把这段代码放在一起做尝试。

Model.objects.annotate(elems=Func(F('tags'), function='unnest')).values_list('elems', flat=True).annotate(c=Count('elems'))

但它返回一个错误

...aggregate function calls cannot contain set-returning function calls
LINE 1: ...COUNT(unnest("...
                 ^
HINT:  You might be able to move the set-returning function into a LATERAL FROM item.

关于如何使这个查询起作用的任何想法?

编辑

这是 Django 的 ORM 生成的 SQL。

SELECT unnest("model"."tags") AS "elems", COUNT(unnest("model"."tags")) AS "c" FROM "model" GROUP BY unnest("model"."tags");

【问题讨论】:

  • 能否请您发布一个完整的数据库查询?
  • 添加了一个编辑。谢谢

标签: django


【解决方案1】:

这个查询对我有用:

select unnest(tags) as tag, count(tags) from model group by tag;

我认为这个 ORM 查询给出了相同的结果:

from django.db.models import Func, F, Count

Model.objects.annotate(tag=Func(F('tags'), function='unnest')).values('tag').order_by('tag').annotate(count=Count('id')).values_list('tag', 'count')

我创建了下表并填充了示例值:

create table model(
    id serial primary key,
    name text,
    tags text[]
);

insert into model(name, tags) values ('a', array['a', 'b', 'c']);
insert into model(name, tags) values ('b', array['b', 'b', 'c']);

select unnest(tags) as tag, count(tags) from model group by tag;

+---+-----+
|tag|count|
+---+-----+
|c  |2    |
|a  |1    |
|b  |3    |
+---+-----+

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2015-08-19
    • 2017-07-27
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多