У меня есть таблица ports(switch_ip, slot_number, port_number, many, more, columns)
, и я хотел бы выполнить следующий запрос PostgreSQL, используя Django:
SELECT switch_ip, array_agg((slot_number, port_number, many, more, columns) ORDER BY slot_number, port_number) info
FROM ports
GROUP BY switch_ip
ORDER BY switch_ip
Используя django.contrib.postgres.aggregates
, вот что я получил так далеко:
Port.objects \
.values('switch_ip') \
.annotate(
info=ArrayAgg('slot_number', ordering=('slot_number', 'port_number'))
) \
.order_by('switch_ip')
Я не могу включить более одного столбца в ArrayAgg
. Ни один из ArrayAgg(a, b, c)
, ArrayAgg((a, b, c))
, ArrayAgg([a, b, c])
, кажется, не работает. Обходной путь может включать отдельные ArrayAgg
s для каждого столбца и каждый с одинаковым порядком. Я бы презирал это, потому что у меня много столбцов. Есть ли более приятный обходной путь, возможно, более низкоуровневый?
Я подозреваю, что это не проблема с самим ArrayAgg, а скорее с выражениями кортежей в целом. Можно ли вообще иметь кортежи в Django запросах? Например, что было бы соответствующим Django из:
SELECT switch_ip, (slot_number, port_number, many, more, columns) info
FROM ports
Если это еще не возможно в Django, насколько осуществимым было бы это реализовать?