获取ArrayField Postgres Django的len

时间:2016-02-25 08:01:10

标签: python django postgresql

我是一个模特: -

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

我想让ModelA的top10对象具有最大的field1长度。我发现Django Docs中有一个len过滤器,但这不符合我的目的。

如何获得具有最大field1长度的top10对象?

2 个答案:

答案 0 :(得分:3)

如果你确定你的数组是1维的,你可以使用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')

答案 1 :(得分: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)
相关问题