Как найти средний рейтинг выступления по другой модели отзывов?

У меня есть две модели Django Models 'Gigs' и 'Reviews' Я хочу получить среднее значение рейтингов, относящихся к полю Gigs. Я также хочу, чтобы значение avg_rating в поле movie обновлялось каждый раз, когда добавляется рецензия. Я новичок в Django и уже многое попробовал, но не могу понять, в чем ошибка. Ниже приведены файлы моего кода

Models.py

class Gigs(models.Model):
    title = models.CharField(max_length=255)
    category = models.ForeignKey(Categories , on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    details = models.TextField()
    seller = models.ForeignKey(User,default=None, on_delete=models.CASCADE)

    @property
    def average_rating(self):
        if self._average_rating is not None:
            return self._average_rating
        return self.reviews.aggregate(Avg('rating'))['rating_avg']

class Reviews(models.Model):
    rating = models.SmallIntegerField( default=0,validators=[MaxValueValidator(5),MinValueValidator(1)])
    comment = models.CharField(max_length=500)
    item = models.ForeignKey(Gigs , on_delete=models.CASCADE, related_name='reviews')
    buyer = models.ForeignKey(User ,default=None, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

Views.py

class GigsListAll(GenericAPIView, ListModelMixin ):
    def get_queryset(self):
        return Gigs.objects.all().annotate(_average_rating=Avg('reviews__rating'))
    serializer_class = GigsSerializer
    permission_classes = (AllowAny,)

    def get(self, request , *args, **kwargs):
        return self.list(request, *args, **kwargs)

Serializers.py

class GigsSerializer (serializers.ModelSerializer):
    average_rating = serializers.FloatField()
    class Meta:
        model = Gigs
        fields = ['id','title','category','price','details','seller','images', 'average_rating']

Но когда я попытался перейти к моему этому Api, он выдает ошибку

.

"Got KeyError when attempting to get a value for field average_rating on serializer GigsSerializer.\nThe serializer field might be named incorrectly and not match any attribute or key on the Gigs instance.\nOriginal exception text was: 'rating_avg'."

Для сериализации свойств следует использовать поле SerializerMethodField. Ваш сериализатор должен выглядеть следующим образом:

class GigsSerializer(serializers.ModelSerializer):
    average_rating = serializers.SerializerMethodField()
    
    def get_average_rating(self, obj):
        return obj.average_rating

    class Meta:
        model = Gigs
        fields = ["""your fields here"""]

Для получения значения поля SerializerMethodField сериализатор ищет метод get_, чтобы вычислить его значение. Метод get_ принимает объект, который будет сериализованным объектом (в данном случае экземпляр Gigs)

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