extra()
функцията е отхвърлена съгласно документи
:
Ето как можете да направите същото, като използвате персонализирана Анотация
функция:
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
стойности от array_length
до 0.