Как уменьшить количество запросов в наборе запросов?
У меня есть следующие сериализаторы:
class LiteratureProductSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
binding = BindingSerializer()
language = LanguageSerializer()
genres = GenreSerializer(many=True)
class Meta:
model = LiteratureProduct
fields = ('year_of_manufacture', 'pages', 'isbn', 'author', 'binding', 'language', 'genres')
class AccessoryProductSerializer(serializers.ModelSerializer):
manufacturer = ManufacturerSerializer()
seria = SeriaSerializer()
material = MaterialSerializer()
class Meta:
model = AccessoryProduct
fields = ('manufacturer', 'seria', 'material', 'size')
class FoodProductSerializer(serializers.ModelSerializer):
manufacturer = ManufacturerSerializer()
class Meta:
model = FoodProduct
fields = ('manufacturer')
class ClotherProductSerializer(serializers.ModelSerializer):
material = MaterialSerializer()
colors = ColorSerializer(many=True)
sizes = SizeSerializer(many=True)
class Meta:
model = ClotherProduct
fields = ('material', 'colors', 'sizes', 'year_of_manufacture')
class ProductSerializer(serializers.ModelSerializer):
category = CategorySerializer()
source = SourceSerializer()
literature_product = LiteratureProductSerializer()
accessory_product = AccessoryProductSerializer()
food_product = FoodProductSerializer()
clother_product = ClotherProductSerializer()
class Meta:
model = Product
fields = ('id', 'name', 'slug', 'description', 'image', 'price', 'discount', 'amount', 'is_active', 'weight', 'rating', 'created_date', 'category', 'source', 'literature_product', 'accessory_product', 'food_product', 'clother_product')
Теперь я хочу отобразить информацию об одном объекте, который может принадлежать к одной из этих четырех категорий. Я создал следующее представление API. Поскольку у меня много отношений ForeignKey и ManyToMany, я использовал select_related и prefetch_related для оптимизации. Вот код моего представления:
class ProductsAPIView(RetrieveAPIView):
serializer_class = ProductSerializer
lookup_field = 'slug'
lookup_url_kwarg = 'product_slug'
def get_queryset(self):
return Product.objects.select_related(
'category', 'source', 'literature_product', 'literature_product__author', 'literature_product__binding', 'literature_product__language', 'accessory_product', 'food_product', 'clother_product',
'accessory_product__manufacturer', 'accessory_product__seria', 'accessory_product__material', 'food_product__manufacturer',
'clother_product__material',).prefetch_related(
Prefetch('literature_product__author'),
Prefetch('literature_product__binding'),
Prefetch('literature_product__language'),
Prefetch('literature_product__genres'),
Prefetch('clother_product__colors'),
Prefetch('clother_product__sizes'),
)
Теперь у меня возникла следующая проблема: запрос становится слишком сложным, потому что даже если продукт находится в категории «Продукты питания», он все равно соединяет данные из таблиц других категорий, что приводит к большому количеству соединений. Что можно сделать в этой ситуации? Может быть, структура базы данных была разработана неправильно?