获取 Postgres Django 的 ArrayField 长度

3

我有一个模型:

class ModelA(models.Model):
    field1 = ArrayField(models.IntegerField())

我希望能够获取ModelA中field1最大长度的前10个对象。我看到Django文档中有一个len过滤器可用,但那并不能满足我的要求。
我该如何获取field1最大长度的前10个对象?
2个回答

4
如果您确定您的数组是一维的,您可以使用PostgreSQL函数cardinality
ModelA.objects.extra(select={'length':'cardinality(field1)'}).order_by('length')

或者,使用 array_length 函数(第二个参数为所需维度数量)。
ModelA.objects.extra(select={'length':'array_length(field1,1)'}).order_by('length')

谢谢@Ian。非常感谢。我肯定有一个一维数组。我能否在ArrayField中找到元素的总频率? - Praful Bagai
仍然是同样的错误。我尝试了你的这个命令:ModelA.objects.extra(select={'length': 'cardinality(field1)'}).order_by('length') - Praful Bagai
打印查询后,我得到了以下结果:- SELECT (cardinality(field1)) AS "length", "moduleName"."id", "moduleName"."field1" FROM "moduleName_modela" ORDER BY "length" ASC - Praful Bagai
似乎我在使用Postgres时遇到了问题。重新安装后它就正常工作了。谢谢 :) - Praful Bagai
我也可以在ArrayField中找到一个元素的总频率吗? - Praful Bagai
显示剩余2条评论

0

我最终也能够得到数组中元素的频率:

q = """
with norm (id, element) as (
    select id, unnest(field1) from model;
)
select id, sum(case when element = 2 then 1 else 0 end)  as count
from norm
group by id
order by count
limit 10;
"""


a = Model.objects.raw(q)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接