Django入门教程(十四)ORM多对多

1、创建项目和app(这里使用的是pycharm快速创建的方式)
2、多对多

就是指一个表中的一条数据对应一个表中的多条数据,另外一个表中的一条数据对应着前一个表中的多条数据。

简单的理解如图所示:
在这里插入图片描述

举个例子。以出版社和文章为例,一个出版社可以出版多篇文章,一篇文章也可以被多个出版社出版。如果按照一对多的关系做映射,那么就会出现一篇文章的id就会对应多个出版社的id的集合,但是关系型数据库中并不支持集合,所以这样就会出现问题,这时就需要多对多的关系实现第三张表(会自动根据多对多关系创建)。以下图做讲解:

在这里插入图片描述

3、编写models.py
①定义一个publication类和Article类。
在这里插入图片描述

对于一对多的关系,Foreig
而对于多对多的:关系可以设置在任意一个表中。现在我们添加至Article类中。
在这里插入图片描述
对于多对多关系,关系是可以设置在任意一个表中。通常我们将设置了多对多关系的称之为从表,没有设置的称为主表。也就是如下图所示。
在这里插入图片描述
②配置settings.py文件中的数据库为mysql。
在这里插入图片描述
③收集models.py中的变化,
在这里插入图片描述
并同步至数据库中。
在这里插入图片描述

4、查看mysql数据库,发现除了定义的article表(默认的表名是APP名_模型)和publication表外,多生成一个article_pub,这个就是由多对多关系自动生成的中间表。
在这里插入图片描述
打开查看,发现它是根据article表的主键和publication表的主键生成的。
在这里插入图片描述

5、编写urls.py
在这里插入图片描述
6、编写views.py,进行数据添加。
在这里插入图片描述

对于一对一和一对多:我们只需先添加主表的数据,再添加从表的数据就可以了。
而对于多对多:我们需要先分别添加两个表的数据,然后再进行关联。
那么如何关联出版社和文章的关系呢?添加如下代码
在这里插入图片描述

完整代码:

from .models import *
from django.http import HttpResponse

def index(request):
    # 添加
    # 一对一和一对多:先添加主表的数据,再添加从表的数据;
    # 多对多:先分别添加两个表的数据,然后再进行关联。
    p1=Publiaction(p_name='新华出版社')
    p1.save()
    p2=Publiaction(p_name='东方出版社')
    p2.save()

    a1=Article(a_name='个税改革')
    a1.save()
    a2=Article(a_name='大桥通车')
    a2.save()

    # 关联文章和出版社的关系
    # a1这个文章对应的出版社是p1和p2,意思就是p1和p2这两个出版社都出版了a1这个文章。
    a1.pub.add(p1,p2)
    a2.pub.add(p2)
    return HttpResponse('数据添加成功')

7、接下来运行项目,访问这个地址。把数据添加至数据库中。
在这里插入图片描述
查看数据库中的表记录。
article表。
在这里插入图片描述
publication表。
在这里插入图片描述
由article表和publication表自动生成的中间表。
在这里插入图片描述

8、查询数据。
①根据主表数据查询从表数据
修改views.py中的index函数。

# 查询"东方出版社"的出版过的所有文章
def index(request):
    p1=Publiaction.objects.get(id=2) # 查询东方出版社
    articles=p1.article_set.all()
    for article in articles:
        print(article.a_name)
    return HttpResponse('数据查询成功')

在这里插入图片描述
刷新查看:
在这里插入图片描述
此时控制台会打印出如下内容:
在这里插入图片描述

②根据从表数据查询主表数据。
继续修改index函数。

# 查询"个税改革"这个文章共有几个出版社出版
def index(request):
    a1=Article.objects.get(id=1)  # 查询个税改革这篇文章
    pubs=a1.pub.all()
    for p in pubs:
        print(p.p_name)
    return HttpResponse('数据查询成功')

在这里插入图片描述
刷新查看:
在这里插入图片描述
在这里插入图片描述

如此,就实现了ORM多对多关系的建立与查询。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值