gpt4 book ai didi

django - 计算 Django ArrayField 中的不同元素

转载 作者:行者123 更新时间:2023-12-02 02:43:22 25 4
gpt4 key购买 nike

我有一个定义的模型

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");

最佳答案

这个查询对我有用:

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 |
+---+-----+

关于django - 计算 Django ArrayField 中的不同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com