如何从django中的模型获取关联数据?

时间:2012-06-20 04:45:36

标签: django templates view model

我尝试在用户点击给定的产品名称后返回相关评论。我使用的观点是:

def index(request):
    prod_list = Website.objects.values('productname').distinct()
    return render_to_response('reserve/templates/index.html', {'prod_list': prod_list})

我的模板是:

 {% for website in prod_list %}
        <a href="/clubs/{{ website.id }}/detail">{{ website.productname }}</a>
        <br>{{  website.review }} <br><br>
    {% endfor %}

我使用的模型是:

class Website(models.Model):
    productname = models.CharField('Website name', max_length = 100)
    review = models.CharField('Review', max_length = 200)
    def __unicode__(self):
        return self.productname

列出的每个产品名称都有多个评论;我遇到的问题是link()没有返回website.id。关于如何解决这个问题的任何建议?

2 个答案:

答案 0 :(得分:1)

来自documentation

  

     

值(*字段)

     

返回一个ValuesQuerySet - 一个返回的QuerySet子类   用作可迭代的字典而不是模型实例   对象。

所以你实际上迭代的是字典对象。

其次,限制值字段时,仅返回这些字段。 prod_list实际上是:

[{'productname': u'Product Name 1'},{'productname': u'Product Name 2'}, ...]

将视图更新为此prod_list = Website.objects.distinct('productname')会使您的模板正确呈现,因为它会返回一个查询集。

修改

由于DISTINCT ON仅支持postgresql,因此您可以使用此方法:

from django.shortcuts import render
# ... your other imports

def index(request):

    prod_list_distinct = set()
    for obj in Website.objects.all():
       prod_list_distinct.add(obj.productname) # sets only allow uniques

    prod_list = Website.objects.filter(productname__in=prod_list_distinct)

    return render(request,
                  'reserve/templates/index.html', {'prod_list': prod_list})

答案 1 :(得分:1)

您的模型结构并不合适。您真正需要的是评论和产品的单独表格,然后是从评论到产品的ForeignKey,以便它们处于一对多的关系中。然后,您可以轻松获取每个不同的产品,并遍历每个产品的评论。