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)
}
При этом, если объем данных действительно огромен, следует использовать некоторую форму пагинации для извлечения данных.