Django:设置多对一模型时遇到问题

时间:2014-05-10 21:45:18

标签: python django

我正在建立一个用户可以上传汉堡评论的网站。他们还可以根据多种标准对汉堡进行评级。然后,我想根据评论中的信息为每个汉堡包制作一个目标网页。我认为我的模型设置正确,但我在查询数据库时遇到了问题。

我的models.py是:

from django.db import models
from datetime import datetime

class Place(models.Model):
    name = models.CharField(max_length=300, unique = True)

    def __unicode__(self):
        return self.name

class Review(models.Model):
    RATINGS = (
    (1, '1'),
    (2, '2'),
    (3, '3'),
    (4, '4'),
    (5, '5'),
    )

    place = models.ForeignKey(Place)
    burger = models.CharField(max_length=150)
    date = models.DateField(default = datetime.now)
    bun = models.IntegerField(max_length=1, choices=RATINGS)
    toppings = models.IntegerField(max_length=1, choices=RATINGS)
    meat = models.IntegerField(max_length=1, choices=RATINGS)
    comments = models.TextField(max_length=2000)
    #photo = models.ImageField(upload_to='', blank=True)

    def __unicode__(self):
        return self.burger

所以现在我想使用每个评论的信息为每个汉堡场所创建一个登陆页面。喜欢"这里的平均面包评级是5。"我如何查询所有评论并在页面上获取此类信息?我能够设置一个简单的登录页面,列出了有关该地点的评论数量,但我无法弄清楚如何做更多的事情。

views.py:

def index(request):

    context = RequestContext(request)

    place_list = Place.objects.all()

    context_dict = {'places': place_list}

    return render_to_response('index.html', context_dict, context)

index.html模板:

{% for place in places %}
<li><a href="/burgers/place/{{ place.url }}">{{ place.name }}</a> | {{place.review_set.count}}</li>

{% endfor %}

1 个答案:

答案 0 :(得分:0)

如果要在着陆页上显示评论,您已经知道了对象。所以你可以这样做:

place = Place.objects.get(name=place_to_land)
reviews = Review.objects.filter(place=place)

现在您有一个可以在html页面上呈现的评论查询集

编辑:

有多种方法可以计算平均评分。您可以在应用程序或DB中执行此操作:

在App中:

count, rating = 0, 0
for review in reviews:
    count += 1
    rating += review.bun
if count:
   av_rating = rating/count

在DB:

reviews = Review.objects.filter(place=place).aggregate(Avg('bun'))