Skip to main content
 首页 » 编程设计

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

2024年10月01日39bjzhanghao

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

模型.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 %} 

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

所以如果我有啤酒,比如说 Blue moon,我有 2 个用户给出 2 个评论:

用户1 香气:3, 外观:3, 口味:8,

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

我想得到 Blue Moon:

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

但仍独立保留其他啤酒的评论值。

感谢您的宝贵时间。

安东尼

请您参考如下方法:

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

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'),  
) 

然后,当您遍历 beers 查询集时,您可以访问带注释的字段。

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

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