Почему мои члены 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, это, вероятно, повысит упорядоченность.