django框架(十三:orm的多对多操作)
什么是多对多?
多对多:一个表中的一条数据对应另一个表中的多条数据;另外一个表中的一条数据对应着前一个表中的多条数据
图例:
以出版社和文章为例:
怎么解决多对多的对应关系呢?
不能使用之前的一对多时的外键了,我们可以通过第三张表来表示。如图:
接下来在models.py文件中创建图例的两个表
class Publiation(models.Model):
'''
出版社(主表)
'''
p_name = models.CharField(max_length=50)
class Article(models.Model):
'''
文章(从表)
'''
a_name = models.CharField(max_length=50)
pub = models.ManyToManyField(Publiation)
一对多:ForeginKey一定要设置在从表
一对一和多对多:关系可以设置在任意一个表中
执行两个命令创建表,会自动创建第三个关系表
往表中添加数据:
先向两个表添加数据,最后才进行数据的关联
数据的添加:
p1 = Publiation(p_name='新华出版社')
p1.save()
p2 = Publiation(p_name='东方出版社')
p2.save()
a1 = Article(a_name='个税改革')
a1.save()
a2 = Article(a_name='大桥通车')
a2.save()
数据表的展示:
数据的关联:
a1.pub.add(p1,p2)
a2.pub.add(p2)
关联表的展示:
该表说明,文章1的出版社有两个(p1,p2),文章2的出版社为一个(p2)
那么,多对多的数据又该怎么查询呢?
1-根据主表数据查询从表数据:
查询东方出版社出版过的所有文章
p = Publiation.objects.get(id=2)
as = p.article_set.all()
for a in as:
print(a.a_name)
2-根据从表数据查询主表数据;
查询个税改革这个文章,共有几个出版社出版
a = Article.objects.get(id=1)
pubs = a1.pub.all()
for p in pubs:
print(p.p_name)