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.