055:ORM外鍵使用詳解

外鍵:
在 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

相關文章
相關標籤/搜索