在django中查询manytomany字段的正确方法是什么

时间:2012-12-06 07:34:05

标签: django django-models django-orm

所以我有一个模型,

class Category(SmartModel):
    item=models.ManyToManyField(Item)
    title=models.CharField(max_length=64,help_text="Title of category e.g BreakFast")
    description=models.CharField(max_length=64,help_text="Describe the category e.g the items included in the category")
    #show_description=check box if description should be displayed
    #active=check box if category is still avialable
    display_order=models.IntegerField(default=0)
    def __unicode__(self):
        return "%s %s %s %s " % (self.item,self.title, self.description, self.display_order)

正如您所看到的,它有一个很多领域

item=models.ManyToManyField(Item) 

我想返回模板中的所有项目,这是我的views.py

def menu(request):
    categorys= Category.objects.all()
    items= categorys.all().prefetch_related('item')
    context={
        'items':items,
        'categorys':categorys
    }
    return render_to_response('menu.html',context,context_instance=RequestContext(request))

这是我在模板中的表现,

    <ul>
{% for item in items %}
 <li>{{ item.item }}

 </li>
</ul>
{% endfor %}

毕竟,这就是它在我的网页中返回的内容,

<django.db.models.fields.related.ManyRelatedManager object at 0xa298b0c>

我做错了什么,我真的环顾四周但都徒劳无功,希望你能帮助我并提前感谢你

2 个答案:

答案 0 :(得分:0)

尝试使用:

categorys= Category.objects.prefetch_related('item').all()

然后在模板中:

{% for category in categorys %}
    {% for item in category.item.all %}
        {{ item }}
    {% endfor %}
{% endfor %}

答案 1 :(得分:0)

确实,你有很多经理人。您需要实际查询某些内容......例如all()

{% for item in items %}
   {% for i in item.item.all %}
        {{ i }}
   {% endfor %}
{% endfor %}

根据您的变量命名,我认为您将prefetch_related的结果混淆为一堆item。它实际上是返回一个Category对象的QuerySet。

因此,将它们称为类别会更直观。

{% for category in categories %}
   {% for item in category.item.all %} 
       {{ item }} {# ...etc #}