То, что вы пытаетесь достичь, - это анти-паттерн prefetch_related
. Предварительная выборка - это выборка «всех» связанных строк, но вариант использования - это разбиение на страницы specifications
.
Предварительная выборка будет полезна в тех случаях, когда число связанных строк в родительской строке составляет ~ 5 (или до 10, помните, что вы тратите пропускную способность сети БД, увеличивая предварительно выбранные дочерние строки. Поэтому, если вы рассматриваете разбиение на страницы, Лучше всего избегать предварительной выборки)
Примечание. Дочерние строки = спецификации, Родительские строки = категории, в вашем случае использования.
Мой ответ будет состоять в том, чтобы избежать использования предварительной выборки в этом случае. Просто используйте следующее
categories = Category.objects.distinct().filter(filters)
--
{% for category in categories %}
<tr>
<th colspan="7">{{ category.name }} - ({{ category.abbr }})</th>
</tr>
# Use some table lib like django-tables
...
Если это простой внутренний проект, выполните go с предварительной загрузкой, без проблем, иначе вы столкнетесь с проблемами производительности БД.