extra() fungsi telah ditinggalkan menurut dokumen
:
Inilah cara Anda dapat melakukan hal yang sama menggunakan Annotation khusus fungsi:
from django.db import models
class ArrayLength(models.Func):
function = 'CARDINALITY'
MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')
Perhatikan bahwa cardinality()
fungsi tersedia di PostgreSQL 9.4 atau lebih baru. Jika Anda menggunakan versi yang lebih lama, Anda harus menggunakan array_length()
:
MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')
Satu peringatan dengan kueri kedua ini adalah bahwa array kosong akan diurutkan di depan semua yang tidak kosong. Ini dapat diselesaikan dengan menggabungkan NULL nilai dari array_length ke 0.