如何在序列化器中使用count()和sum()?

发布于 2025-01-27 22:53:45 字数 2173 浏览 3 评论 0原文

我想计算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)

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

I want to calculate the average rating on 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'

This is my current serializer

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)

How to calculate the average rating using this serializer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾城泪 2025-02-03 22:53:45

您唯一的选择是这种情况是使用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']

The only option you have is this case is to use a SerializerMethodField. Something like this should work (if I understood what you asked for):

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']
别忘他 2025-02-03 22:53:45

您始终可以编写serializers.serializermethodfield()以在串行化中返回动态计算的字段。

在您的具体情况下,您也应该发布Worksplessmodel,以更加清晰。

You can always write a serializers.SerializerMethodField() to return dynamically calculated fields in serializers.

In your specific case, you should post WorkSamplesModel as well for more clarity.

且行且努力 2025-02-03 22:53:45

以下代码为我工作..!

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

Following code work for me..!

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']
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文