Как найти средний рейтинг выступления по другой модели отзывов?
У меня есть две модели 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)