【问题标题】:How to get average across different models in django?如何在 django 中获得不同模型的平均值?
【发布时间】:2012-06-30 14:22:27
【问题描述】:

我正在尝试获取给定类别中所有产品的每个产品的平均评分(在评论模型中找到)。我很难做到这一点。相关的urlconf、视图、模板如下:

url(r'^category/(?P<category_id>\d+)/$', 'view_product_category'),

class Productbackup(models.Model):
    website = models.CharField('Product name', max_length = 200)
    website_url = models.URLField('Product URL')
    category = models.ForeignKey(Categories)
    def __unicode__(self):
        return self.website

class ProductbackupForm(ModelForm):
    class Meta:
        model = Productbackup

def get_avg_rating(self):
    reviews = Reviewbackup.objects.filter(product=self)
    count = len(reviews)
    sum = 0
    for rvw in reviews:
        sum += rvw.rating
    return (sum/count)

class Reviewbackup(models.Model):
    review = models.CharField('Review', max_length = 2000)
    rating = models.IntegerField(max_length=200)
    product = models.ForeignKey(Product)
    def __unicode__(self):
        return self.review

class Categories(models.Model):
    category = models.CharField('Category_second', max_length = 200)
    def __unicode__(self):
        return unicode(self.category)

def view_product_category(request, category_id):
    allproduct = Productbackup.objects.filter(category_id=category_id)
    #get average for each product within a category
    return render_to_response('reserve/templates/view_category.html', {'allproduct':allproduct},
    context_instance=RequestContext(request))

{% for product in allproduct %}
    <a href = "/products/{{ product.id}}/reviews"> {{ product.website }}</a>: <a href = "{{ product.website_url }}"> Direct link</a><br>
    #average rating for that product
{{ product.get_avg_rating }}    
{% endfor %}

【问题讨论】:

  • ProductbackupReviewbackup 是什么?
  • Productbackup = 代表产品(网站)的模型。 Reviewbackup = 代表评论的模型

标签: django templates view model average


【解决方案1】:

我将在Product 模型上添加方法以获得平均评分。

class Productbackup(models.Model):
    website = models.CharField('Product name', max_length = 200)
    website_url = models.URLField('Product URL')
    category = models.ForeignKey(Categories)
    def __unicode__(self):
        return self.website

    def get_avg_rating(self):
        reviews = Reviewbackup.objects.filter(product=self)
        count = len(reviews)
        sum = 0
        for rvw in reviews:
            sum += rvw.rating
        return (sum/count)

在模板中:

{% for product in allproducts %}
    <a href = "/products/{{ product.id}}/reviews"> {{ product.website }}</a>: <a href = "{{ product.website_url }}"> Direct link</a><br>
    #average rating for that product    
    {{ product.get_avg_rating }}
{% endfor %}

注意:在您的代码中传递“所有产品”而不是“产品”。所以相应地更新视图代码。在您的代码中 {% for product in product %} 使用相同的变量名,这是不正确的。

【讨论】:

  • 我已经进行了更改,但它没有引入 product.get_avg_rating。我已经将该方法包含在 models.py 文件中(与 reviewbackup 和 productbackup 所在的位置相同)。我错过了什么吗?
  • @sharataka 我希望方法名称没有拼写错误。更新代码的相关部分可能会有所帮助。
  • 我已更新了您推荐的最新编辑,但仍有一些问题。我是否应该在视图中加入其他内容以获取平均值?当我输入 {{ product.get_avg_rating }} 行时没有任何显示。
  • @sharataka 'get_avg_rating' 应该在 'ProductBackup' 模型/类中定义。它应该缩进一级。我正在为此更正我的帖子。
  • 请问你会使用 Reviewbackup.objects.filter(product=self).aggregate(Avg('rating')) 吗?
【解决方案2】:

非常有效(无需迭代)的方法是使用 aggregationsAvg() 方法,

    class Productbackup(models.Model):
        website = models.CharField('Product name', max_length = 200)
        website_url = models.URLField('Product URL')
        category = models.ForeignKey(Categories)
        def __unicode__(self):
            return self.website

        def get_avg_rating(self):
            reviews = Reviewbackup.objects.filter(product=self).aggregate(rating_avg=Avg('rating'))
            return (reviews['rating_avg'])

在模板中:

    {% for product in allproducts %}
        <a href = "/products/{{ product.id}}/reviews"> {{ product.website }}</a>: <a href = "{{ product.website_url }}"> Direct link</a><br>
        #average rating for that product    
        {{ product.get_avg_rating }}
    {% endfor %}

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2018-10-22
    • 2022-08-14
    • 2020-10-26
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多