Django - Оптимизация группировки

У меня есть модель:

from django.db import models

class Product(models.Model):
    sku = models.IntegerField()
    plu = models.CharField()
    pack_type = models.ForeignKey(PackTypes, on_delete=models.CASCADE)

Мне нужно сгруппировать их в структуру данных:

{ 
    < plu_1 >: { 
        < sku_1 >: [ 
            < pack_type_id_1 >,
            < pack_type_id_2 >,
            ...
        ],
        < sku_2 >: [],
        ...
    },
    <plu_2>: {
        ...
    }
}

Код, который это делает:

def dict_with_list():
    return defaultdict(list)

result = defaultdict(dict_with_list)
products = Product.objects.values_list('sku', 'plu', 'pack_type_id')

for (plu, sku, pack_type_id) in products:
    result[plu][sku].append(pack_type_id)

Проблема в том, что из-за большого количества записей в модели Product код работает медленно (> 5 секунд).

Как я могу оптимизировать код, чтобы он стал быстрее?

Вы можете позволить базе данных выполнить группировку:

from operator import itemgetter
from itertools import groupby

products = Product.objects.values_list('sku', 'plu', 'pack_type_id').order_by(
    'sku', 'plu'
)

items = {
    k1: {k2: list(map(itemgetter(2), v)) for k2, v in groupby(itemgetter(1), vs)}
    for k1, vs in groupby(itemgetter(0), products)
}

При этом, если объем данных действительно огромен, следует использовать некоторую форму пагинации для извлечения данных.

Вернуться на верх