django 表關係之 多對多

2021-10-13 02:59:58 字數 3121 閱讀 5184

比如一篇文章和標籤的關係。一篇文章可以有多個標籤,乙個標籤可以被多篇文章所引用。因此標籤和文章的關係就是典型的多對多的關係。

下邊只是一篇文章對應多個標籤;乙個標籤對應多篇文章就不舉例了,自己腦補下!

# 這樣我們會通過articles欄位來獲取某個標籤tags下邊的所有文章

articles = models.manytomanyfield('article', related_name='tags')

class meta:

db_table = 'tags'

對映到資料庫中如下:

上邊**中,我們明明建立了2個表,為何又多出乙個表來呢。在mysql中如果要實現多對多的關係,2張表是不夠的,還需要一張表叫中間表,這三個表之間的關係如下:

通過上邊和下邊對映到資料庫中的字段,可以更加明了的看出他們之前的關係

注意:django會自動幫助我們建立一張中間表。這個中間表分別定義了兩個外來鍵(tags_id 和 article_id),引用到的是article表中的id和tags表中的id,對應的是兩張表的主鍵(下邊中間表是articles_id 之前關聯錯表了,這裡糾正下)。

假如articles表中和tags表中都有資料了,現在需要關聯多對多的關係:

# 分別取出tags表中第一條資料與articles表中第一條資料進行關聯

tag = tags.objects.get(pk=1)

articles_tag = articles.objects.get(pk=1)

articles_tag.tags.add(tag)

return render(res, 'test_html.html')

對映到資料庫如下,tags表中第一條資料與articles表中第一條資料關聯成功:

對映到資料庫tags_articles表如下:

從上邊tags_articles錶能清晰的看到文章和標籤的關係 -一篇id為1的文章可以對應1和3兩個標籤。

from django.shortcuts import render

def index(res):

tag = tags.objects.get(pk=1)

articles_tag = articles.objects.get(pk=2)

articles_tag.tags.add(tag)

return render(res, 'test_html.html')

對映到資料庫tags_articles表如下:

從上圖能看到 -乙個id為1的標籤 可以對應id為1和2的兩篇文章。

注意:

上邊我們多次使用了articles_tag.tags.add(),這裡的tags是在tags表中設定的:

class tags(models.model):

# ··· ···

articles = models.manytomanyfield('article', related_name='tags')

在前幾篇文章記錄過好幾次了,這裡在記錄一遍加深印象!在django中,表a使用manytomanyfield關聯了另一張表b,django會自動給表b新增乙個屬性為:表a的名的小寫形式_set,但是當我們設定了related_name這個關聯名稱這個關鍵字的時候,django將不再會自動給表b新增那個屬性了,取而代之的是我們設定的tags這個屬性,對於表b來說,可以用這個屬性來關聯a表,就是如此簡單!

Django 十三 續 多對多關係表的操作

引 之前我們建立了表中course表和studen表是多對多關係的,並且多對多關係的建立我們寫在了student表中,下面要對django給他們自動生成的中間表進行操作 正向 s1 student.objects.get s id 5 c1 course.objects.get c id 1 s1....

Django 鍊錶查詢 多對多建表

背景 有兩張表 1.作者 2.書籍 關係 乙個作者可以寫多本書 一本書也可以多個作者 思路 類似於給作者表做乙個外鍊錶 inner join 作者表 class author models.model id models.autofield primary key true name models....

sql語句之多表關係 一對多 多對多

建立主表 分類表 create table category cid int primary keyauto increment cname varchar 20 建立從表 產品表 create table product pid int primary keyauto increment pnam...