如何统计电商平台卖家所有产品的总评论数与平均评分?
问题描述
我正在搭建一个电商网站,该网站设有商家账户系统。每位商家可上传商品图片及完整售卖信息,且可售卖不同类型的商品。买家可对购买的商品进行评价。我需要展示卖家所有商品收到的买家反馈总数及平均评分,示例如下:seller-1: 10 reviews, 4.5 star,seller-2: 5 reviews, 4.8 star,seller-3: 11 reviews, 4.1 star。
基于以下models.py代码,请问该如何实现?
class Products(models.Model): user = models.ForeignKey(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE, blank=True, null=True) product_title = models.CharField(blank=True, null=True, max_length = 250) brand = models.CharField(max_length=250, blank=True, null=True) product_desc = RichTextField(blank=True, null=True) class ProductREVIEWS(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userREVIEW',on_delete=models.CASCADE) product = models.ForeignKey(Products, related_name='productREVIEWrelatedNAME',on_delete=models.CASCADE) feedBACK = models.TextField(blank=True, null=True) rating = models.IntegerField(blank=True, null=True)
实现方案
可以通过Django的聚合查询(annotate)快速实现需求,具体步骤如下:
1. 视图层编写统计逻辑
在视图函数或类视图中,关联用户、商品、评价三个模型,聚合计算每个卖家的总评价数和平均评分:
from django.db.models import Count, Avg from django.contrib.auth.models import User from .models import Products, ProductREVIEWS def seller_review_stats(request): # 聚合每个卖家的评价数据 sellers_stats = User.objects.annotate( total_reviews=Count('merchandise_product_related_name__productREVIEWrelatedNAME'), average_rating=Avg('merchandise_product_related_name__productREVIEWrelatedNAME__rating') ).filter(total_reviews__gt=0) # 可选:仅显示有评价的卖家 # 对平均分保留一位小数,优化展示效果 for seller in sellers_stats: if seller.average_rating: seller.average_rating = round(seller.average_rating, 1) return render(request, 'seller_stats.html', {'sellers_stats': sellers_stats})
逻辑说明:
Count('merchandise_product_related_name__productREVIEWrelatedNAME'):通过卖家的商品关联到评价表,统计总评价数量Avg('merchandise_product_related_name__productREVIEWrelatedNAME__rating'):计算该卖家所有商品评价的平均分- 若你的用户模型有商家专属标识(比如
is_seller字段),可在filter中追加is_seller=True,只统计商家用户
2. 模板层展示数据
在对应的模板文件(如seller_stats.html)中,循环渲染每个卖家的统计信息:
{% for seller in sellers_stats %} <p>seller-{{ seller.id }}: {{ seller.total_reviews }} reviews, {{ seller.average_rating }} star</p> {% endfor %}
额外处理:无评分的情况
如果卖家有评价但无评分(rating字段为空),可在模板中做兜底处理:
{% for seller in sellers_stats %} <p>seller-{{ seller.id }}: {{ seller.total_reviews }} reviews, {% if seller.average_rating %}{{ seller.average_rating }}{% else %}0{% endif %} star</p> {% endfor %}
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

