在models.py中,我创建了两张表,他们分别是作者表和书籍表,且之间的关系是多对多。
1#书
2classBook(models.Model):
3id=models.AutoField(primary_key=True)#自增的主键
4title=models.CharField(max_length=64,null=False,unique=True)#创建一个varchar(64)不为空的唯一的书名字段
5publisher=models.ForeignKey(to='Publisher',on_delete=models.CASCADE)#和Publisher关联的外键字段
6
7#作者——注意作者和书应该是多对多的关系
8classAuthor(models.Model):
9id=models.AutoField(primary_key=True)
10name=models.CharField(max_length=16,null=False,unique=True)
11#通过下面这条语句,不仅可以生成Author表,还可以自动生成第三张表
12book=models.ManyToManyField(to='Book')#建立作者和书的多对多的关系
执行相关代码之后,生成三张表:
其中,app_author_book表如下图所示:
author表和book表通过生成第三张表,联系各自的id值相关联。
现在我想在一个页面展示我的所有作者:
1#展示作者
2defauthor_list(request):
3
4author_obj=models.Author.objects.all()
5returnrender(request,'author_list.html',{'author_list':author_obj})
再创建一个author_list.html页面把author_obj的值传过去:
1<tableborder="1">
2<thead>
3<tr>
4<th>编号</th>
5<th>ID</th>
6<th>作者姓名</th>
7<th>作品</th>
8</tr>
9</thead>
10<tbody>
11{%forauthorinauthor_list%}
12<tr>
13<td>{{forloop.counter}}</td>
14<td>{{author.id}}</td>
15<td>{{author.name}}</td>
16<td>
17{%forbookinauthor.book.all%}
18{%ifforloop.last%}
19{{book.title}}
20{%else%}
21{{book.title}}|
22{%endif%}
23{%endfor%}
24</td>
25</tr>
26{%endfor%}
27</tbody>
28</table>
问题来了,因为作者和书籍是多对多的关系,那么一个作者可能对应多本书,一本书也可能有多个作者。我想在每个作者后面展示他的作品,在models.py中我在Author表中加入了book字段,通过book字段我可以调用Book表中的数据,如上述代码的17行所示,我写的是author.book.all,为什么要写.all,而不是直接写author.book呢,正是因为一个作者可能有多本书,通过all可以显示所有的书的数据,而如果只写author.book的话,结果显示为None。所以记住,如果是多对多关系,记住别忘记加all哦。
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h54856.shtml