如何查询Django ArrayField的长度?

时间:2018-02-20 07:06:47

标签: django postgresql django-models django-queryset

我在模型中有一个ArrayField,我试图注释这个字段的长度(到目前为止没有任何运气)

F('field_name__len')无效,因为F()内不允许加入。甚至 ModelName.objets.values('field_name__len')无效

有什么想法吗?

我正在使用 django 1.11

2 个答案:

答案 0 :(得分:4)

docs不推荐使用extra()函数:

  

将此方法用作最后的选择

     

这是一个旧的API,我们打算在将来的某个时候弃用。仅当无法使用其他查询集方法表达查询时,才使用它。

以下是使用自定义Annotation函数可以执行相同操作的方法:

from django.db import models

class ArrayLength(models.Func):
    function = 'CARDINALITY'

MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')

请注意,cardinality()函数在PostgreSQL 9.4或更高版本中可用。如果您使用的是旧版本,则必须使用array_length()

MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')

第二个查询的一个警告是,一个空数组将在所有非空数组的前面排序。这可以通过将NULL的{​​{1}}值合并为0来解决。

答案 1 :(得分:2)

ModelName.objects.extra(select={'length':'cardinality(field_name)'}).order_by('length')

你可以试试这个