好的,这就是交易。我正在开发这个网络应用程序,它可以让您创建用户、啤酒和啤酒评论。
模型.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 的文档更多示例。
