Почему мои члены Django Postgres `ArrayAgg` не сортируются?

Я изучаю использование ArrayAgg и не понимаю, почему 'histidine-[13C6,15N3]' не встречается перед 'isoleucine-[13C6,15N1]' в этом примере:

In [25]: for i in Infusate.objects.annotate(tns=ArrayAgg("tracer_links__tracer__name", order_by="tracer_links__tracer__name")).order_by("tns").distinct():
    ...:     print(i.tns)
    ...: 
['inosine-[15N4]']
['isoleucine-[13C6,15N1]', 'leucine-[13C6,15N1]', 'valine-[13C5,15N1]']
['isoleucine-[13C6,15N1]', 'lysine-[13C6,15N2]', 'phenylalanine-[13C9,15N1]', 'threonine-[13C4,15N1]', 'tryptophan-[13C11]', 'histidine-[13C6,15N3]']

Записи/строки сортируются на основе первого значения, что замечательно, но это первое значение не сортируется по сравнению с другими значениями в списке.

Если на то пошло, почему порядок элементов списка вообще не меняется, когда я отменяю order_by в ArrayAgg? Согласно тому, что я прочитал, это должно привести к сортировке элементов списка. Я что, слепой? Что я делаю не так?

In [25]: for i in Infusate.objects.annotate(tns=ArrayAgg("tracer_links__tracer__name", order_by="-tracer_links__tracer__name")).order_by("tns").distinct():
    ...:     print(i.tns)
    ...: 
['inosine-[15N4]']
['isoleucine-[13C6,15N1]', 'leucine-[13C6,15N1]', 'valine-[13C5,15N1]']
['isoleucine-[13C6,15N1]', 'lysine-[13C6,15N2]', 'phenylalanine-[13C9,15N1]', 'threonine-[13C4,15N1]', 'tryptophan-[13C11]', 'histidine-[13C6,15N3]']

Ого! Я работаю над Django 4.2 и просматривал документацию по версии 5.2! Это ordering в 4.2. order_by это 5.2:

In [28]: for i in Infusate.objects.annotate(tns=ArrayAgg("tracer_links__tracer__name", ordering="tracer_links__tracer__name")).order_by("tns").distinct():
    ...:     print(i.tns)
    ...: 
['histidine-[13C6,15N3]', 'isoleucine-[13C6,15N1]', 'lysine-[13C6,15N2]', 'phenylalanine-[13C9,15N1]', 'threonine-[13C4,15N1]', 'tryptophan-[13C11]']
['inosine-[15N4]']
['isoleucine-[13C6,15N1]', 'leucine-[13C6,15N1]', 'valine-[13C5,15N1]']

Если это делается только для оформления заказа, вы можете просто сначала определить самый маленький товар:

from django.db.models import Min


Infusate.objects.alias(
    lowest_name=Min('tracer_links__tracer__name')
).order_by('lowest_name')

Если вы поставите db_index=True в поле name, это, вероятно, повысит упорядоченность.

Вернуться на верх