django開發系列:ORM數據庫外鍵使用詳解
ORM外鍵使用
article是文章,category是文章分類,注意分類必須先存在,所以要先保存
category = Category(name='最新文章')
category.save()
article = Article(title='abc',content='111')
article.category = category
article.save()
外鍵刪除操作:
如果一個模型使用了外鍵。那麼在對方那個模型被刪掉後,該進行什麼樣的操作。可以通過on_delete來指定。可以指定的類型如下:
- CASCADE:級聯操作。如果外鍵對應的那條數據被刪除了,那麼這條數據也會被刪除。
- PROTECT:受保護。即只要這條數據引用了外鍵的那條數據,那麼就不能刪除外鍵的那條數據。如果我們強行刪除,Django就會報錯。
- SET_NULL:設置爲空。如果外鍵的那條數據被刪除了,那麼在本條數據上就將這個字段設置爲空。如果設置這個選項,前提是要指定這個字段可以爲空。
- SET_DEFAULT:設置默認值。如果外鍵的那條數據被刪除了,那麼本條數據上就將這個字段設置爲默認值。如果設置這個選項,前提是要指定這個字段一個默認值 。
- SET():如果外鍵的那條數據被刪除了。那麼將會獲取SET函數中的值來作爲這個外鍵的值。SET函數可以接收一個可以調用的對象(比如函數或者方法),如果是可以調用的對象,那麼會將這個對象調用後的結果作爲值返回回去。可以不用指定默認值 。
- DO_NOTHING:不採取任何行爲。一切全看數據庫級別的約束。
以上這些選項只是Django級別的,數據級別依舊是RESTRICT!
數據庫層面的約束有四種:
- RESTRICT:默認的選項,如果想要刪除父表的記錄時,而在子表中有關聯該父表的記錄,則不允許刪除父表中的記錄;
- NOACTION:同RESTRICT效果一樣,也是首先先檢查外鍵;
- CASCADE:父表delete、update的時候,子表會delete、update掉關聯記錄;
- SET NULL:父表delete、update的時候,子表會將關聯記錄的外鍵字段所在列設爲null,所以注意在設計子表時外鍵不能設爲not null;