获取不同模型实例的用户输入评级的平均值(Django)

时间:2017-08-30 21:04:53

标签: python django

好的,这就是交易。我正在开发这个网络应用程序,可以让你为啤酒创建用户,啤酒和评论。

models.py:

from django.db import models
from django.conf import settings

class BeerModel(models.Model):

    user = models.ForeignKey(User, default=1)
    name = models.CharField(max_length=254, default="")
    style = models.CharField(max_length=254, default="")
    ibu = models.IntegerField(default="")
    calories = models.IntegerField(default="")
    abv = models.IntegerField(default="")
    location = models.CharField(max_length=254, default="")

    class Meta:
        verbose_name_plural = 'Beers'

    def __str__(self):
        return self.name

    def avg(self):
        return


class RateModel(models.Model):

    FIVE_REVIEWS = (
        ('5', '5'),
        ('4', '4'),
        ('3', '3'),
        ('2', '2'),
        ('1', '1'),
    )

    TEN_REVIEWS= (
        ('10', '10'),
        ('9', '9'),
        ('8', '8'),
        ('7', '7'),
        ('6', '6'),
        ('5', '5'),
        ('4', '4'),
        ('3', '3'),
        ('2', '2'),
        ('1', '1'),
    )

    user = models.ForeignKey(User, default=1)
    beer = models.ForeignKey(BeerModel)
    aroma = models.PositiveIntegerField(max_length=2, choices=FIVE_REVIEWS, default="5")
    appearance = models.PositiveIntegerField(max_length=2, choices=FIVE_REVIEWS, default="5")
    taste = models.PositiveIntegerField(max_length=2, choices= TEN_REVIEWS, default= "10")

    class Meta:
        verbose_name_plural = 'Ratings'

    def __str__(self):
        return str(self.beer)

如您所知,您可以使用不同的用户为不同的啤酒创建评论。

我的目标是在HTML上输入django,每种啤酒的“香气,外观和味道”的“平均”值。

这就是我在views.py中的内容:

@login_required
def home(request):
    beers = BeerModel.objects.order_by('name')
    rates = RateModel.objects.order_by('user')
    avg = RateModel.objects.aggregate(aroma = Avg('aroma'), appearance = Avg('appearance'), taste = Avg('taste'))
    dict = {'records': beers, 'rates': rates, 'avg': avg}

    return render(request, 'beer_tracker/home.html', context=dict)

这就是我在home.html上的内容:

<h2>Overall Rating</h2>
    {% for beers in records %}
        <div class="table">
            <h4><b>Beer's Overall Ratings: </b>{{ beers.name}}</h4>
            <ul>
                <li><b>Aroma: </b>{{ avg.aroma }}</li>
                <li><b>Appearance: </b>{{ avg.appearance }}</li>
                <li><b>Taste: </b>{{ avg.taste }}</li>
            </ul>
        </div>
     {% endfor %}

不幸的是,正如你所知,我得到了所有啤酒的平均值。我需要每种特定啤酒的平均值。

所以,如果我有啤酒,那就说蓝月亮,我有2位用户给出2条评论:

User1的 香气:3, 外观:3, 味道:8,

用户2 香气:5, 外观:5, 味道:10,

我想换蓝月亮:

香气:4, 外观:4, 味道:9,

但仍然保持其他啤酒的评论价值。

感谢您的时间。

安东尼

1 个答案:

答案 0 :(得分:1)

您应该使用平均值来注释啤酒查询集,而不是使用聚合。

from django.db.models import Avg

beers = BeerModel.objects.order_by('name').annotate(
    avg_aroma=Avg('ratemodel__aroma'),
    avg_appearance=Avg('ratemodel__appearance'),
    avg_taste=Avg('ratemodel__taste'), 
)

然后,当您循环浏览啤酒查询集时,您可以访问带注释的字段。

{% for beer in beers %}
{{ beer.avg_aroma }}
{{ beer.avg_appearance} } 
{{ beer.avg_taste }}
{% endfor %} 

有关更多示例,请参阅joins and aggregates的文档。