extra()
funktionen har fasats ut enligt dokument
:
Så här kan du göra samma sak med en anpassad Annotation
funktion:
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Observera att kardinalitet()
funktionen är tillgänglig i PostgreSQL 9.4 eller senare. Om du använder en äldre version måste du använda array_length()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
En varning med denna andra fråga är att en tom array kommer att sorteras framför alla icke-tomma. Detta skulle kunna lösas genom att sammanföra NULL
värden från array_length
till 0.