Il extra()
la funzione è stata deprecata in base a documenti
:
Ecco come puoi fare la stessa cosa usando un'Annotation
personalizzata funzione:
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Tieni presente che cardinality()
la funzione è disponibile in PostgreSQL 9.4 o versioni successive. Se stai utilizzando una versione precedente, devi utilizzare array_length()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
Un avvertimento con questa seconda query è che un array vuoto verrà ordinato davanti a tutti quelli non vuoti. Questo potrebbe essere risolto unendo NULL
valori da array_length
a 0.