python使用ORM之如何调用多对多关系

目录

在models.py中,我创建了两张表,他们分别是作者表和书籍表,且之间的关系是多对多。

	--------------------------------------------------------------------
	注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687
	--------------------------------------------------------------------

# 书
  class Book(models.Model):
  id = models.AutoField(primary_key=True)# 自增的主键
 title = models.CharField(max_length=64, null=False, unique=True)  # 创建一个varchar(64)不为空的唯一的书名字段
 publisher = models.ForeignKey(to='Publisher',on_delete=models.CASCADE) # 和Publisher关联的外键字段
 
 # 作者——注意作者和书应该是多对多的关系
 class Author(models.Model):
 id = models.AutoField(primary_key=True)
 name = models.CharField(max_length=16,null=False,unique=True)
 # 通过下面这条语句,不仅可以生成Author表,还可以自动生成第三张表
 book = models.ManyToManyField(to='Book')# 建立作者和书的多对多的关系

执行相关代码之后,生成三张表:在这里插入图片描述
 其中,app_author_book表如下图所示:在这里插入图片描述
 author表和book表通过生成第三张表,联系各自的id值相关联。

现在我想在一个页面展示我的所有作者:

 # 展示作者
 def author_list(request):
 
     author_obj = models.Author.objects.all()
     return render(request,'author_list.html',{'author_list':author_obj})

再创建一个author_list.html页面把author_obj的值传过去:

 <table border="1">
      <thead>
      <tr>
          <th>编号</th>
          <th>ID</th>
          <th>作者姓名</th>
          <th>作品</th>
      </tr>
      </thead>
     <tbody>
     {% for author in author_list %}
         <tr>
         <td>{{ forloop.counter }}</td>
         <td>{{ author.id }}</td>
         <td>{{ author.name }}</td>
        <td>
             {% for book in author.book.all %}
                 {% if forloop.last %}
                     {{ book.title }}
                  {% else %}
                     {{ book.title }}|
                 {% endif %}
             {% endfor %}
         </td>
         </tr>
     {% endfor %}
     </tbody>
 </table>

问题来了,因为作者和书籍是多对多的关系,那么一个作者可能对应多本书,一本书也可能有多个作者。我想在每个作者后面展示他的作品,在models.py中我在Author表中加入了book字段,通过book字段我可以调用Book表中的数据,如上述代码的17行所示,我写的是author.book.all,为什么要写.all,而不是直接写author.book呢,正是因为一个作者可能有多本书,通过all可以显示所有的书的数据,而如果只写author.book的话,结果显示为None。所以记住,如果是多对多关系,记住别忘记加all哦。

简陋的结果如下图:
  在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值