【问题标题】:How to use count() and sum() in serializer?如何在序列化程序中使用 count() 和 sum()?
【发布时间】:2023-02-06 16:31:26
【问题描述】:

我想计算 sum_of_rating/number_of_rating 的平均评分。

class SearchWorkingProfessionals(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)
class WorkSamplesModel(models.Model):
    work_sample_image = models.ImageField(blank=True,null=True,upload_to="work_samples")
    work_sample_description = models.CharField(max_length=1000)
    is_business_card_image = models.BooleanField(default=False)
    business_account = models.ForeignKey(BusinessAccountModel,on_delete=models.CASCADE)

如何使用此序列化程序计算平均评分?

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    在这种情况下,您唯一的选择是使用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=Avg('rating'))['average_rating']
    

    【讨论】:

    • 类型错误:QuerySet.aggregate() 收到非表达式:评级。错误显示为 get_average_rating() get_count_feedbacks() 工作正常..
    【解决方案2】:

    您始终可以编写 serializers.SerializerMethodField() 以在序列化程序中返回动态计算的字段。

    在您的具体情况下,您还应该发布 WorkSamplesModel 以便更清楚。

    【讨论】:

      【解决方案3】:

      以下代码对我有用..!

      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']
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        相关资源
        最近更新 更多