El extra()
ha quedado obsoleta de acuerdo con documentos
:
Así es como puede hacer lo mismo usando una Annotation
personalizada función:
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Tenga en cuenta que el cardinality()
La función está disponible en PostgreSQL 9.4 o posterior. Si está usando una versión anterior, debe usar array_length()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
Una advertencia con esta segunda consulta es que una matriz vacía se ordenará delante de todas las que no estén vacías. Esto podría resolverse fusionando NULL
valores de array_length
a 0.