Как использовать count() и sum() в сериализаторе?
Я хочу вычислить средний рейтинг по sum_of_rating/number_of_rating.
class SearchWorkingProgessionals(APIView):
def post(self,request,format=None):
tags = request.data.get('tag_arr')
city_name = request.data.get('city_name')
tags_list = tags.split(',')
ws = WorkSamplesModel.objects.filter(business_account__serviceareasmodel__city_name=city_name,
business_account__professiontagsmodel__tag_name__in=tags_list,
is_business_card_image=True).distinct()
serializer = SearchWorkingProgessionalsSerializer(ws,many=True)
resp = {'resp':serializer.data}
return Response(resp)
class FeedbackModel(models.Model):
feedback_text = models.CharField(max_length=20)
rating = models.IntegerField()
business_account = models.ForeignKey(BusinessAccountModel,on_delete=models.CASCADE)
class Meta:
db_table = 'feedback'
Это мой текущий сериализатор
class SearchWorkingProgessionalsSerializer(serializers.Serializer):
business_account_id = serializers.IntegerField()
first_name = serializers.CharField(source='business_account.user.first_name')
last_name = serializers.CharField(source='business_account.user.last_name')
profile_pic = serializers.ImageField(source='business_account.user.profile_pic')
business_title = serializers.CharField(source='business_account.business_title')
business_description = serializers.CharField(source='business_account.business_description')
status = serializers.CharField(source='business_account.status')
note = serializers.CharField(source='business_account.note')
work_sample_image = serializers.ImageField()
work_sample_description = serializers.CharField(max_length=1000)
Как вычислить средний рейтинг с помощью этого сериализатора?
Вы всегда можете написать serializers.SerializerMethodField() для возврата динамически вычисляемых полей в сериализаторах.
В вашем конкретном случае для большей ясности следует также опубликовать WorkSamplesModel.
Единственный вариант, который у вас есть в этом случае - использовать SerializerMethodField. Что-то вроде этого должно сработать (если я понял, о чем вы просили):
from django.db.models import Avg
class SearchWorkingProgessionalsSerializer(serializers.Serializer):
count_feedbacks = serializer.SerializerMethodField()
average_rating = serializer.SerializerMethodField()
# Returns the number of ratings
def get_count_feedbacks(self, instance):
return instance.business_account.feedbackmodel_set.count()
# Returns the average rating
def get_average_rating(self, instance)
return instance.business_account.feedbackmodel_set.aggregate(average_rating=('rating'))['average_rating']
Следующий код работает для меня...
from django.db.models import Avg
...
class SearchWorkingProfessionalsSerializer(serializers.Serializer):
business_account_id = serializers.IntegerField()
first_name = serializers.CharField(source='business_account.user.first_name')
last_name = serializers.CharField(source='business_account.user.last_name')
profile_pic = serializers.ImageField(source='business_account.user.profile_pic')
business_title = serializers.CharField(source='business_account.business_title')
business_description = serializers.CharField(source='business_account.business_description')
status = serializers.CharField(source='business_account.status')
note = serializers.CharField(source='business_account.note')
work_sample_image = serializers.ImageField()
work_sample_description = serializers.CharField(max_length=1000)
feedback_count = serializers.SerializerMethodField('get_feedback_count')
average_rating = serializers.SerializerMethodField()
def get_feedback_count(self, instance):
return instance.business_account.feedbackmodel_set.count()
def get_average_rating(self, instance):
return instance.business_account.feedbackmodel_set.aggregate(average_rating=Avg('rating'))['average_rating']