Дополнительное обходное решение для подзапросов в Django, отличное от mysql
Я пытаюсь подготовить subnet=adress/netmask для представления, а start_ip и end_ip для фильтрации в lifs qs. Затем я хочу использовать подзапрос для отсечения одного интерфейса, так как у vserver их может быть несколько. Проблема в том, что я не могу передать дополнительное поле, созданное в lifs queryset.
lifs = (NetworkLif.objects.filter(vserverid=OuterRef('pk'))
.annotate(network=Concat('address', Value('/'), 'netmasklength', output_field=CharField()))
.extra(select={'start_ip': "INET_NTOA(INET_ATON(address) & 0xffffffff ^ ((0x1 << ( 32 - netmasklength) ) -1 ))"})
.extra(select={'end_ip': "INET_NTOA(INET_ATON(address) | ((0x100000000 >> netmasklength ) -1 ))"})
.order_by('network')
)
queryset = (Vserver.objects.filter(type='DATA')
.exclude(name__endswith='-mc')
.annotate(subnet=Subquery(lifs.values('network' )[:1]),
#.annotate(start_ip_address=Subquery(lifs.values('start_ip')[:1]))
#.annotate(end_ip_address=Subquery(lifs.values('end_ip')[:1]))
.values('id', 'clusterid__name', 'name', 'state', 'nfsenabled', 'cifsenabled', 'ldapclientenabled', 'dnsenabled', 'subnet', )#'start_ip_address')#, 'end_ip_address' )
.order_by('id')
)
получаю эту ошибку, я предполагаю, что это из-за логики вычисления
raise FieldError("Cannot resolve expression type, unknown output_field")
django.core.exceptions.FieldError: Cannot resolve expression type, unknown output_field
есть ли какой-нибудь обходной путь? Я знаю, что в postgresql distinct('name') решит мою проблему. К сожалению, ActiveIQ работает на mysql.