1. 程式人生 > >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一定要設定在從表 一對一和多對多:關係可以設定在任意一個表中

執行兩個命令建立表,會自動建立第三個關係表 在這裡插入圖片描述

往表中新增資料: 先向兩個表新增資料,最後才進行資料的關聯 資料的新增:

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)