PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment interroger la longueur d'un Django ArrayField ?

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.