Shshzik
@Shshzik
Начинающий

Как оптимизировать запросы к изображениям в модели Django?

Есть такие модели:

class Product(models.Model):
    name = models.CharField()
    color_variant_of = models.ForeignKey('self', blank=True, null=True, related_name="color_variants", verbose_name='Вариант цвета')

class ProductColor(models.Model):
    name = models.CharField()
    hex_name = models.CharField()

class ProductInfo(models.Models):
    product = models.OneToOneField(Product)
    color = models.ForeignKey(ProductColor)

class ProductImage(models.Model):
    product = models.ForeignKey(ProductColor)
    image = models.ImageField()


Делаю страницу каталога. Нужно вывести мини-карточки в которых изображение будет меняться в зависимости от выбранного цвета. У товара может быть несколько цветов и это сделано через color_variant_of.

Тоесть я беру товар (Product), дальше беру все варианты цветов - product.color_variants__set.all, из них я беру цвет - product.productinfo.color (а так же все остальные варианты цветов) и изображения product.productimage__set.all

Всё это выливается в 500 и большее запросов в БД при генерации шаблона.

Что с этим делать? Мне нужно как-то меня архитектуру проекта или кешировать что-то или можно как-то соединять вместе запросы до рендера шаблона?
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
@deliro
prefetch_related

И да, prefetch_related можно кастомизировать, чтобы он фетчил не всё подряд
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Astrohas
@Astrohas
Python/Django Developer
Во первых какая-та странная структура.
Во первых зачем делать отдельную модель Product info если все равно у них связь 1к1? Перенесите поля из ProductInfo к Product.

Для начала используйте Select_related потом можете использовать prefetch related.
Если не помогает (ну мало ли что), можете заниматься monkey patching-ом
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы