Pycharm開(kāi)發(fā)Django的外鍵和表關(guān)系
外鍵和表關(guān)系
外鍵:
在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支持外鍵約束的。外鍵的存在使得ORM框架在處理表關(guān)系的時(shí)候異常的強(qiáng)大。因此這里我們首先來(lái)介紹下外鍵在Django中的使用。
類定義為class ForeignKey(to,on_delete,**options)。第一個(gè)參數(shù)是引用的是哪個(gè)模型,第二個(gè)參數(shù)是在使用外鍵引用的模型數(shù)據(jù)被刪除了,這個(gè)字段該如何處理,比如有CASCADE、SET_NULL等。這里以一個(gè)實(shí)際案例來(lái)說(shuō)明。比如有一個(gè)User和一個(gè)Article兩個(gè)模型。一個(gè)User可以發(fā)表多篇文章,一個(gè)Article只能有一個(gè)Author,并且通過(guò)外鍵進(jìn)行引用。那么相關(guān)的示例代碼如下:
class User(models.Model):
? ? username = models.CharField(max_length=20)
? ? password = models.CharField(max_length=100)
class Article(models.Model):
? ? title = models.CharField(max_length=100)
? ? content = models.TextField()
? ? author = models.ForeignKey("User",on_delete=models.CASCADE)
以上使用ForeignKey來(lái)定義模型之間的關(guān)系。即在article的實(shí)例中可以通過(guò)author屬性來(lái)操作對(duì)應(yīng)的User模型。這樣使用起來(lái)非常的方便。示例代碼如下:
article = Article(title='abc',content='123')
author = User(username='張三',password='111111')
article.author = author
article.save()
# 修改article.author上的值
article.author.username = '李四'
article.save()
為什么使用了ForeignKey后,就能通過(guò)author訪問(wèn)到對(duì)應(yīng)的user對(duì)象呢。因此在底層,Django為Article表添加了一個(gè)屬性名_id的字段(比如author的字段名稱是author_id),這個(gè)字段是一個(gè)外鍵,記錄著對(duì)應(yīng)的作者的主鍵。以后通過(guò)article.author訪問(wèn)的時(shí)候,實(shí)際上是先通過(guò)author_id找到對(duì)應(yīng)的數(shù)據(jù),然后再提取User表中的這條數(shù)據(jù),形成一個(gè)模型。