如何在Django中计算并展示供应商的平均评分
解决方案
1. 模型层(models.py)
先确认你的模型结构包含供应商、任务与评分关联,示例结构如下:
from django.db import models class Vendor(models.Model): name = models.CharField(max_length=100) # 其他供应商属性,比如联系方式、地址等 class Task(models.Model): STATUS_CHOICES = [ ('completed', '已完成'), ('pending', '待处理'), ] vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE, related_name='tasks') status = models.CharField(max_length=20, choices=STATUS_CHOICES) score = models.IntegerField(null=True, blank=True) # 1-5分的评分字段 # 其他任务属性,比如任务名称、截止日期等
如果已有模型,只需确保Vendor与Task的外键关联正确,且存在有效的评分字段。
2. 视图层(views.py)
在获取供应商列表时,通过聚合函数计算每个供应商的已完成任务平均评分:
from django.db.models import Avg from django.shortcuts import render from .models import Vendor def vendor_list(request): # 为每个供应商添加平均评分属性,仅统计已完成且有评分的任务 vendors = Vendor.objects.annotate( avg_score=Avg( 'tasks__score', filter=models.Q(tasks__status='completed') & models.Q(tasks__score__isnull=False) ) ) return render(request, 'vendor_list.html', {'vendors': vendors})
annotate会为每个供应商对象新增avg_score属性,存储计算出的平均值- 通过
filter限定只计算已完成且评分不为空的任务,避免无效数据干扰
3. 前端HTML模板
在供应商列表表格中渲染平均评分列,处理无评分的情况:
<table> <thead> <tr> <th>供应商名称</th> <th>平均评分</th> <!-- 其他列,比如联系人、合作次数等 --> </tr> </thead> <tbody> {% for vendor in vendors %} <tr> <td>{{ vendor.name }}</td> <td> {% if vendor.avg_score %} {{ vendor.avg_score|floatformat:2 }} {% else %} 暂无评分 {% endif %} </td> <!-- 其他列渲染 --> </tr> {% endfor %} </tbody> </table>
floatformat:2将平均评分格式化为两位小数,显示更规范- 针对无评分的供应商,显示“暂无评分”替代空白内容
额外提示
如果使用非Django框架(如Flask),核心逻辑一致:查询供应商列表时,关联任务表,筛选已完成任务,聚合计算评分平均值后传递给前端渲染。
内容的提问来源于stack exchange,提问作者henoker
相关产品推荐
相关产品推荐

