Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django中获得不同模型的平均值?_Django_Templates_View_Model_Average - Fatal编程技术网

如何在django中获得不同模型的平均值?

如何在django中获得不同模型的平均值?,django,templates,view,model,average,Django,Templates,View,Model,Average,我试图获得给定类别中所有产品的每种产品的平均评级(在评论模型中找到)。我做这件事有困难。相关的urlconf、视图和模板如下所示: url(r'^category/(?P<category_id>\d+)/$', 'view_product_category'), class Productbackup(models.Model): website = models.CharField('Product name', max_length = 200) websit

我试图获得给定类别中所有产品的每种产品的平均评级(在评论模型中找到)。我做这件事有困难。相关的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 %}
url(r'^category/(?P\d+)/$,“view\u product\u category”),
类Productbackup(models.Model):
网站=models.CharField('Product name',max_length=200)
website\u url=models.URLField(‘产品url’)
类别=型号。外键(类别)
def ___; unicode(自):
返回自助网站
类别ProductbackupForm(ModelForm):
类元:
型号=产品备份
def获得平均额定值(自):
reviews=Reviewbackup.objects.filter(产品=自身)
计数=len(审查)
总和=0
对于审查中的rvw:
总和+=rvw额定值
返回(总和/计数)
类回顾备份(models.Model):
review=models.CharField('review',最大长度=2000)
额定值=型号。整数字段(最大长度=200)
产品=型号。外键(产品)
def ___; unicode(自):
返回自我回顾
类别(models.Model):
类别=型号.CharField('category_second',max_length=200)
def ___; unicode(自):
返回unicode(self.category)
def视图产品类别(请求、类别id):
allproduct=Productbackup.objects.filter(category\u id=category\u id)
#获取类别内每个产品的平均值
返回render_to_response('reserve/templates/view_category.html',{'allproduct':allproduct},
上下文\实例=请求上下文(请求))
{allproduct%中的产品为%1}
:
#该产品的平均评级 {{product.get_avg_rating} {%endfor%}
我将在
产品
模型上添加方法以获得平均评级

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 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 %}
{%用于allproducts%}
:
#该产品的平均评级 {{product.get_avg_rating} {%endfor%}
注意:传递代码中的“allproducts”而不是“product”。因此,相应地更新视图代码。在您的代码中,
{%for product In product%}
使用了相同的变量名,这是不正确的。

执行此操作的有效方法是使用
Avg()
方法

    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 %}
    {% 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 %}
{%用于allproducts%}
:
#该产品的平均评级 {{product.get_avg_rating} {%endfor%}
什么是
Productbackup
Reviewbackup
?Productbackup=表示产品(网站)的模型。Reviewbackup=表示Reviews的模型我已经做了更改,但它没有拉入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'))好吗?