2017-03-09 55 views
0

例如,我有以下型号:Django从多行获取结果到列表中?

class Author(models.Model): 
    firstname = models.CharField(max_length=30) 
    book = models.CharField(max_length=30) 

我想我的模板做一些事情,导致下面的HTML。因此,对于每个具有相同名字的作者,它会迭代并填充具有该作者姓名的所有书籍的列表。

<h3>Author First Name</h3> 
<ul> 
    <li>Book1</li> 
    <li>Book2</li> 
    <li>Book3</li> 
</ul> 
<h3>Author First Name2</h3> 
<ul> 
    <li>Book4</li> 
    <li>Book9</li> 
</ul 

我不知道如何构建一个Django Queryset来允许我这样做。

+1

你的模型设计太糟糕了,你不能写这样的查询。首先学习如何使用ForeignKey或OneToManyField或ManyToManyField设计模型。祝你好运:) –

+0

要给予@ AshrafulIslam的评论更多的细节 - 你应该有另一个名为'Book'的模型,它通过ForeignKey或其他关系链接到'Author'。 – ChidG

+0

感谢您的建议。外键解决方案是我想要的东西。 – JimmyT

回答

0

您可能需要在视图函数中执行一些此类工作。

L1 = Author.objects.all().order_by('firstname').values('firstname', 'book') 

将返回记录列表。

from itertools import group_by 
from operator import itemgetter 

group_by(L1, itemgetter('firstname')) 

会给你一个作者名单,每个作者都有书。

让我们假设您将此作为list1传递给您的模板。然后在你的模板里面你可以做:

{% for k, v in list1 %} 
    <h3>{{ k }}</h3> 
    <ul> 
    {% for b in v %} 
     <li>{{ b }}</li> 
    {% endfor %} 
    </ul> 
{% endfor %}