【问题标题】:Rendering average rating on a single product - probably an easy solve, but cannot find the problem呈现单个产品的平均评分 - 可能很容易解决,但找不到问题
【发布时间】:2022-08-05 22:11:35
【问题描述】:

我试图从用户对该单个产品的每个评分中显示给定单个产品的平均评分。

我设法做到了。然而,我的代码似乎呈现所有产品和相关评论,而不仅仅是特定产品。

显然,我在某处告诉代码渲染所有产品而不是一个。但我不太确定在哪里。我认为它来自我的views.py 中的代码。

在同一页面中还要指定一些内容,我正在尝试显示:

  1. 每个产品的平均评论(这就是我的工作)
  2. 不同用户对特定产品的所有评论(有效)

    是不是 2. 这会造成问题?我也应该在视图的第二行中引用 product_id 吗? (如果有,在哪里?)

    楷模

    class Product(models.Model):
        name = models.CharField(\'Product Name\', max_length=120, null=True)
        class Meta:
            db_table=\'Product\'
        def __str__(self):
            return str(self.name)
    
    class ReviewRating(models.Model):
        user = models.ForeignKey(User,blank=True,on_delete=models.CASCADE)
        product=models.ForeignKey(Product,related_name=\"comments\", on_delete=models.CASCADE)
        rating_1 = models.IntegerField(choices=RATING1,default=0)    
        def __str__(self):
            return \'%s - %s - %s\'%(self.user, self.product, self.date_added)
    

    意见

    from django.db.models import Avg
     
    def Notes (request, product_id):
        product = Product.objects.get(pk=product_id)
        data = Product.objects.order_by(\'name\').annotate(
            avg_rating_1 =Avg(\'comments__rating_1 \'),
    
        return render(request, \'main/notes.html\',{\'product\':product, \'data\':data})
    

    模板

    {% for ReviewRating in data%}
    
    {{ReviewRating.avg_rating_1 }}
    
    {% endfor %}
    

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您好,您应该使用聚合和 @property 装饰器将此方法用作项目中的字段。这里以您的代码为例。

    class Product(models.Model):
        name = models.CharField('Product Name', max_length=120, null=True)
    
        class Meta:
            db_table='Product'
    
        def __str__(self):
            return str(self.name)
        
        @property
        def rating(self):
            rating = self.comments.aggregate(Avg('rating_1'))['rating_1__avg']
    
    

    在您的模板中,您可以像这样使用它:

    {% for ReviewRating in champagnes %}
    
    {{ReviewRating.rating_1 }}
    
    {% endfor %}
    

    不要忘记导入 Avg from django.db.models import Avg

    【讨论】:

    • 你好呀。我没有工作,至少没有改善这种情况。在这种情况下,平均值的计算有效。只是模板显示了所有产品的平均值,而不是特定的产品页面。那有意义吗?
    【解决方案2】:

    解决了。

    我只需要将视图从order_by 更改为filter(pk=product_id),所以:

    from django.db.models import Avg
     
    def Notes (request, product_id):
        product = Product.objects.get(pk=product_id)
        data = Product.objects.filter(pk=product_id).annotate(
            avg_rating_1 =Avg('comments__rating_1 '),
    
        return render(request, 'main/notes.html',{'product':product, 'data':data})
    

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多