Я новичок в django и какое-то время застрял в этой проблеме. У меня есть модель ProductVariant, модель обзора (используется специальный менеджер, который я предоставлю здесь)
и моя класс сериализатора:
class RatingSerializer(serializers.ModelSerializer):
class Meta:
model = Review
fields = ['id', 'rate', 'message', 'datetime', 'status']
class ProductVariantSerializer(serializers.ModelSerializer):
rating_avg = serializers.FloatField()
class Meta:
model = ProductVariant
fields = [
'id', 'product', 'size', 'color',
'price', 'image', 'rating_avg'
]
class ProductVariantDetailSerializer(serializers.ModelSerializer):
rating_avg = serializers.FloatField()
rating_count = serializers.IntegerField()
ratings = RatingSerializer(many=True, source='approved_ratings')
class Meta:
model = ProductVariant
fields = [
'id', 'product', 'size', 'color', 'price', 'image',
'created_at', 'updated_at', 'rating_avg', 'rating_count', 'ratings'
]
Моя проблема в том, что, когда я использую ProductVariantSerializer, у меня есть два запроса (я использую django Silk), но когда я меняю сериализатор на ProductVariantDetailSerializer, это почти 120, это вид, который я использую:
Я новичок в django и какое-то время застрял в этой проблеме. У меня есть модель ProductVariant, модель обзора (используется специальный менеджер, который я предоставлю здесь) и моя класс сериализатора: [code]class ApprovedReviewManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(status='approved')
class ProductVariant(models.Model): class SizeChoices(models.TextChoices): SMALL = 'sm', 'SMALL' MEDIUM = 'md', 'MEDIUM' LARGE = 'lg', 'LARGE' XLARGE = 'xlg', 'XLARGE' XXLARGE = 'xxlg', 'XXLARGE'
class Review(models.Model): class RateChoices(models.TextChoices): FIVE = '5', 'FIVE' FOUR = '4', 'FOUR' THREE = '3', 'THREE' TWO = '2', 'TWO' ONE = '1', 'ONE'
objects = models.Manager() approved = ApprovedReviewManager() [/code] а вот классы сериализатора, которые я использую: [code]class RatingSerializer(serializers.ModelSerializer): class Meta: model = Review fields = ['id', 'rate', 'message', 'datetime', 'status']
class ProductVariantSerializer(serializers.ModelSerializer): rating_avg = serializers.FloatField()
class Meta: model = ProductVariant fields = [ 'id', 'product', 'size', 'color', 'price', 'image', 'rating_avg' ]
class Meta: model = ProductVariant fields = [ 'id', 'product', 'size', 'color', 'price', 'image', 'created_at', 'updated_at', 'rating_avg', 'rating_count', 'ratings' ] [/code] Моя проблема в том, что, когда я использую ProductVariantSerializer, у меня есть два запроса (я использую django Silk), но когда я меняю сериализатор на ProductVariantDetailSerializer, это почти 120, это вид, который я использую: [code]class HomePagePopularProducts(generics.ListAPIView): serializer_class = serializers.ProductVariantSerializer permission_classes = [AllowAny]
def get_queryset(self): return ProductVariant.objects.prefetch_related( Prefetch( 'ratings', queryset=Review.approved.all(), to_attr='approved_ratings' ) ).annotate( avg_rat=Avg('ratings__rate'), ).order_by('avg_rat')[:10] [/code] поскольку я использую prefetch_related, я думал, что запрос будет оптимизирован, но, похоже, это не так, что я сделал не так?