Как оптимизировать запрос к модели с внешними ключами И полем многие ко многим
(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