У Postgres действительно хороший способ создать массив из подзапроса.Так что если вы используете Postgres, это будет работать для вас.
from django.db.models import OuterRef, Subquery
class Array(Subquery):
template = 'ARRAY(%(subquery)s)'
product_sub = Product.objects.filter(category=OuterRef('pk'))
products = Category.objects.annotate(
product_list=Array(product_sub.values('name')[:6])
).values_list('product_list', flat=True)
Этот способ более эффективен: давайте сравним с вашей версией
Ваша версия: 1 запрос для категорий + количество категорий, умноженное на1 запрос на продукцию.Один для цикла.
Моя версия: 1 запрос.