外鍵:
在 MySQL 中,表有兩種引擎,一種是 InnoDB ,另一種是 myisam 。若是使用的是 InnoDB 引擎,是支持外鍵約束的。外鍵的存在使得 ORM 框架在處理表關係的時候異常的強大。所以這裏咱們首先來介紹下外鍵在 Django 中的使用。app
類定義爲 class ForeignKey(to,on_delete,**options) 。第一個參數是引用的是哪一個模型,第二個參數是在使用外鍵引用的模型數據被刪除了,這個字段該如何處理,好比有 CASCADE 、 SET_NULL 等。這裏以一個實際案例來講明。好比有一個 User 和一個 Article 兩
個模型。一個 User 能夠發表多篇文章,一個 Article 只能有一個 Author ,而且經過外鍵進行引用。那麼相關的示例代碼以下:框架
class Category(models.Model): username = models.CharField(max_length=128) class Article(models.Model): title = models.CharField(max_length=128) content = models.TextField() category = models.ForeignKey("Category", on_delete=models.CASCADE)
以上使用 ForeignKey 來定義模型之間的關係。即在 article 的實例中能夠經過 author 屬性來操做對應的 User 模型。這樣使用起來很是的方便。示例代碼以下:spa
def index(request): category = Category(username="張三") category.save() article = Article(title='fuck', content='fuck me') article.category = category article.save()
print(article.category.username)
article.category.username = '李四'
print(article.category.username)
return HttpResponse('success')
爲何使用了 ForeignKey 後,就能經過 author 訪問到對應的 user 對象呢。所以在底層, Django 爲 Article 表添加了一個 屬性名_id 的字段(好比author的字段名稱是author_id),這個字段是一個外鍵,記錄着對應的做者的主鍵。之後經過 article.author 訪問的時候,其實是先經過 author_id 找到對應的數據,而後再提取 User 表中的這條數據,造成一個模型。3d
若是想要引用另一個 app 的模型,那麼應該在傳遞 to 參數的時候,使用 app.model_name 進行指定。以上例爲例,若是 User 和 Article 不是在同一個 app 中,那麼在引用的時候的示例代碼以下:code
class Article(models.Model): title = models.CharField(max_length=128) content = models.TextField() category = models.ForeignKey("Category", on_delete=models.CASCADE) user = models.ForeignKey('cms.user',on_delete=models.CASCADE, null=True) # 對應app模型下面的表
若是模型的外鍵引用的是自己本身這個模型,那麼 to 參數能夠爲 'self' ,或者是這個模型的名字。在論壇開發中,通常評論均可以進行二級評論,便可以針對另一個評論進行評論,那麼在定義模型的時候就須要使用外鍵來引用自身。示例代碼以下:對象
class comment(models.Model): content = models.TextField() origin_comment = models.ForeignKey('self', on_delete=models.CASCADE) # 或 # origin_comment = models.ForeignKey('comment', on_delete=models.CASCADE)
相關工程截圖:blog