我在模型中有一个ArrayField,我试图注释这个字段的长度(到目前为止没有任何运气)
F('field_name__len')
无效,因为F()
内不允许加入。甚至
ModelName.objets.values('field_name__len')
无效
有什么想法吗?
我正在使用 django 1.11
答案 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')
你可以试试这个