django框架(十三:orm的多对多操作)

什么是多对多?
多对多:一个表中的一条数据对应另一个表中的多条数据;另外一个表中的一条数据对应着前一个表中的多条数据
图例:
django框架(十三:orm的多对多操作)

以出版社和文章为例:
怎么解决多对多的对应关系呢?
不能使用之前的一对多时的外键了,我们可以通过第三张表来表示。如图:
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一定要设置在从表
一对一和多对多:关系可以设置在任意一个表中

执行两个命令创建表,会自动创建第三个关系表
django框架(十三:orm的多对多操作)

往表中添加数据:
先向两个表添加数据,最后才进行数据的关联
数据的添加:

p1 = Publiation(p_name='新华出版社')
    p1.save()
    p2 = Publiation(p_name='东方出版社')
    p2.save()

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

数据表的展示:
django框架(十三:orm的多对多操作)
数据的关联:

	a1.pub.add(p1,p2)
    a2.pub.add(p2)

关联表的展示:
django框架(十三:orm的多对多操作)
该表说明,文章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)