从不同的模型示例中获取多个评分值的平均值(Django)

svmlkihl  于 2022-12-14  发布在  Go
关注(0)|答案(2)|浏览(105)

我正在开发一个网络应用程序,它可以让项目经理在完成一项任务/工作后给供应商打分models.py。

class Rating(models.Model):
    RATE_CHOICES = [
        (1, 'Below Expectation greater than 0.02'),
        (2, 'Meet Expectaion 0.02'),
        (3, 'Exceed Expectaions less than 0.02'),
    ]
    
    reviewer = models.ForeignKey(CustomUser, related_name="evaluator", 
    on_delete=models.CASCADE, null=True, blank=True)
    reviewee = models.ForeignKey(Vendor, null=True, blank=True, 
     related_name="evaluated_vendor", on_delete=models.CASCADE)
    job = models.ForeignKey(Job, on_delete=models.CASCADE, null=True, blank=True, 
    related_name='jobrate')

    date = models.DateTimeField(auto_now_add=True)
    text = models.TextField(max_length=200, blank=True)
    rate = models.PositiveSmallIntegerField(choices=RATE_CHOICES)

class Job(models.Model):
    title = models.CharField(null=True, blank=True, max_length=100)
    project_manager = models.ForeignKey(CustomUser, on_delete = models.CASCADE, 
    related_name="assigned_by")
    startDate = models.DateField(blank=True, null=True)
    deadlineDate = models.DateField(blank=True, null=True)
    status = models.CharField(choices=STATUS, default='In Preparation', max_length=100)
    evaluated = models.BooleanField(default=False)
    #Related Fields
    purchaseOrder = models.ForeignKey(PurchaseOrder, blank=True, null=True, 
    on_delete=models.CASCADE)
    project = models.ForeignKey(Project, blank=True, null=True, 
    on_delete=models.CASCADE, related_name="Main_Project")
    assigned_to = models.ForeignKey(Vendor, blank=True, null=True, 
    on_delete=models.CASCADE, related_name="Job_owner")

class Vendor(models.Model):

    #Basic Fields.
    vendorName = models.CharField(null=True, blank=True, max_length=200)
    addressLine1 = models.CharField(null=True, blank=True, max_length=200)
    country = models.CharField(blank=True, choices=COUNTRY_CHOICES, max_length=100)
    postalCode = models.CharField(null=True, blank=True, max_length=10)
    phoneNumber = models.CharField(null=True, blank=True, max_length=100)
    emailAddress = models.CharField(null=True, blank=True, max_length=100)
    taxNumber = models.CharField(null=True, blank=True, max_length=100)
    mother_language = models.CharField(blank=True, choices=LANGUAGE_CHOICES, 
    max_length=300)

这是我的view.py:

@login_required
def vendors(request):
    context = {}
    vendors = Vendor.objects.all()
    context['vendors'] = vendors
    

    if request.method == 'GET':
        form = VendorForm()
        context['form'] = form
        return render(request, 'projects/vendors.html', context)

    if request.method == 'POST':
        form = VendorForm(request.POST, request.FILES)

        if form.is_valid():
            form.save()

            messages.success(request, 'New Vendor Added')
            return redirect('vendors')
        else:
            messages.error(request, 'Problem processing your request')
            return redirect('vendors')

    return render(request, 'projects/vendors.html', context)

然后在我的HTML中,我希望在平均比率列中呈现给定供应商完成的多个作业的平均评级。例如,如果供应商完成了2个作业,并分别获得评级1和2。供应商的平均比率将是1.5。我希望表格显示此平均比率。
下面是我在HTML中的当前设置:

<table class="table table-striped table-sm">
      <thead>
        <tr>
          <th scope="col">Vendor Name</th>
          <th scope="col">Mother Tongue</th>
          <th scope="col"> Average Rating</th>
          <th scope="col">Email Address</th>
          <th scope="col">Phone Number</th>
          <th scope="col">Address Line</th>
          <th scope="col">Country</th>
          
        </tr>
      </thead>
      <tbody>
        
      {% for vendor in vendors %}
      <tr>
        <td>{{vendor.vendorName}}</td>
        <td>{{vendor.mother_language}}</td>
        <td>{{vendor.averagerating | stringformat:".2f"}}</td>
        <td>{{vendor.emailAddress}}</td>
        <td>{{vendor.phoneNumber}}</td>
        <td>{{vendor.addressLine1}}</td>
        <td>{{vendor.country}}</td>
       
      </tr>
        {% endfor %}

      </tbody>
    </table>

因此,问题是我如何获得给定供应商完成的所有工作的平均评级,并将其显示在我的供应商列表中。请注意,平均评级列当前未显示任何内容,它是空的。我们将感谢您的回答。提前感谢。

jm81lzqq

jm81lzqq1#

用相关评级对象的平均值注解视图中的vendors

vendors = Vendor.objects.all().annotate(
    averagerating=Avg("evaluated_vendor__rate"),
)

请参阅文档的这一部分以了解其工作原理的详细信息。

nkkqxpd9

nkkqxpd92#

与AKX相关的帖子:您还可以尝试从Rating模型中获取聚合,如下所示:

vendor_ranking = Rating.objects.filter(reviewee=vendor).aggregate(Avg("rate"))

相关问题