extra()
funkcja została uznana za przestarzałą zgodnie z dokumenty
:
Oto jak możesz zrobić to samo za pomocą niestandardowej Adnotacji
funkcja:
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Pamiętaj, że cardinality()
funkcja jest dostępna w PostgreSQL 9.4 lub nowszym. Jeśli używasz starszej wersji, musisz użyć długość_tablicy()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
Jedynym zastrzeżeniem w przypadku tego drugiego zapytania jest to, że pusta tablica zostanie posortowana przed wszystkimi niepustymi. Można to rozwiązać, łącząc NULL
wartości z array_length
do 0.