Как оптимизировать запрос к модели с внешними ключами И полем многие ко многим

(https://pastebin.com/qCMypxwz) Это мои модели.

На данный момент сделано 14 запросов, чтобы получить желаемый результат. В основном, запрос делается для получения изображений, связанных с каждым продуктом. Изображение - это поле "многие ко многим", потому что каждый продукт имеет много изображений.

productList = Variants.objects.select_related('prod_id__category')

            for productName in productList:
                products = dict()
               
                prod_id = productName.id 
                products['id'] = prod_id

                products['category'] = productName.prod_id.category.category_name
                products['prod_name'] = productName.prod_id.prod_name
               
        
                prod_images = list(productName.image.values_list('image_url').distinct())
                image_list = list()
                
                for image in prod_images:     
                    image_list.append(image[0])
                products['image'] = image_list
                price =  productName.price
                products['price'] = price
                createdAt =  productName.createdAt
                products['createdAt'] = createdAt
                productListDict.append(products)

Вы можете использовать .prefetch_related(..) [Django-doc] для получения всех Image в одном дополнительном запросе:

variants = Variants.objects.select_related(
    'prod_id__category'
).prefetch_related('image')

Вы можете получить к ним доступ с помощью my_variant.image.all(), но поскольку этот набор запросов уже предварительно запрограммирован, он не будет загружать Image снова.


Примечание: Обычно не добавляют суффикс …_id к полю ForeignKey, так как Django автоматически добавит поле-"близнец" с суффиксом …_id. Поэтому он должен быть product, вместо prod_id.

.

Примечание: обычно имена полей в модели Django записываются в snake_case, а не PascalCase, поэтому должно быть: created_at вместо createdAt.


Примечание: обычно модели Django дается сингулярное имя, поэтому Variant вместо Variants.

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