如何从另一个评论模型中找到演出的平均评分?



我有两个Django模型'Gigs'和'Reviews',我想获得属于该Gigs字段的评分的平均值。我还希望每次添加评论时,movie字段上的avg_rating都会更新。我是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']

但是当我试图进入我的thisApi时它给了我一个错误

"在试图获取序列化器GigsSerializer上的字段average_rating的值时得到KeyError .n序列化器字段可能命名不正确,并且与Gigs实例上的任何属性或键不匹配。原始异常文本为:'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实例)

最新更新