Le extra()
fonction a été déconseillée selon le documents
:
Voici comment vous pouvez faire la même chose en utilisant une Annotation
personnalisée fonction :
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Notez que la cardinality()
La fonction est disponible dans PostgreSQL 9.4 ou version ultérieure. Si vous utilisez une version plus ancienne, vous devez utiliser array_length()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
Une mise en garde avec cette deuxième requête est qu'un tableau vide sera trié avant tous ceux qui ne sont pas vides. Cela pourrait être résolu en fusionnant NULL
valeurs de array_length
à 0.