django外來鍵如何賦值
在寫專案的過程中我們不可避免的會使用到外來鍵這個東西,那麼Django中是怎樣來使用外來鍵的呢?
瞭解外來鍵
在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支援外來鍵約束的。外來鍵的存在使得ORM框架在處理表關係的時候異常的強大。MySQL資料庫預設使用的也是InnoDB引擎。
使用外來鍵
新建一個專案,建立一個article的app,新增至settings中,並且在settings中設定資料庫的連線,調至整個專案能執行為止。
類定義為class ForeignKey(to,on_delete,**options)。第一個引數是引用的是哪個模型,第二個引數是在使用外來鍵引用的模型資料被刪除了,這個欄位該如何處理,比如有CASCADE、SET_NULL等(外來鍵刪除各個引數的意思)。這裡以一個實際案例來說明。比如有一個Category和一個Article兩個模型。一個種類下可以包含多篇文章,一個Article只能有一個種類,並且透過外來鍵進行引用。那麼相關的示例程式碼如下:
1. 在同一個app中使用外來鍵
在article中的models中寫入程式碼:
from django.db import models # Create your models here. class Category(models.Model): name = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() # 是由Category影響Article category = models.ForeignKey('Category',on_delete=models.CASCADE)
這裡我們就在Article中設定了一個外來鍵category。
以上使用ForeignKey來定義模型之間的關係。即在article的例項中可以透過category屬性來操作對應的Category模型。這樣使用起來非常的方便。示例程式碼如下:views中寫入
from django.shortcuts import render from . import models from django.http import HttpResponse # Create your views here. def index(request): # 插入資料 # article = models.Article(title='abc',content='111') # category = models.Category(name='最新文章') # category.save() # article.category = category # article.save() #讀取資料 article = models.Article.objects.first() print(article.category.name) return HttpResponse('successful')
在上面程式碼中把相應的註釋去了,就能夠進行測試了。
為什麼使用了ForeignKey後,就能透過category訪問到對應的Catrgory物件呢。因此在底層,Django為Article表新增了一個屬性名_id的欄位(比如category的欄位名稱是category_id),這個欄位是一個外來鍵,記錄著對應的種類的主鍵。以後透過article.category訪問的時候,實際上是先透過category_id找到對應的資料,然後再提取Category表中的這條資料,形成一個模型。
如果想要引用另外一個app的模型,那麼應該在傳遞to引數的時候,使用app.model_name進行指定。例如,如果User和Article不是在同一個app中,那麼在引用的時候的示例程式碼如下:
首先新建一個user的app,並且新增至settings中,在user中的models中寫入程式碼,建立一個User模型
from django.db import models # Create your models here. class User(models.Model): username = models.CharField(max_length=100)
再在article中的models中新增這個外來鍵,即在Article這個模型中新新增一個屬性
author = models.ForeignKey('user.User',on_delete=models.CASCADE,null=True)
如果模型的外來鍵引用的是本身自己這個模型,那麼to引數可以為self,或者是這個模型的名字。在論壇開發中,一般評論都可以進行二級評論,即可以針對另外一個評論進行評論,那麼在定義模型的時候就需要使用外來鍵來引用自身。示例程式碼如下:
class Comment(models.Model): content = models.TextField() orihin_comment = models.ForeignKey('self',on_delete=models.CASCADE)
這樣我們就實現了新增了一個外來鍵引用自身。
外間刪除操作的引數意思:
如果一個模型使用了外來鍵。那麼在對方那個模型被刪掉後,該進行什麼樣的操作。可以透過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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1762/viewspace-2836898/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django(15)外來鍵和表關係Django
- django | 為 model 定義邏輯外來鍵Django
- Django中ORM外來鍵和表的關係(Django程式設計-4)DjangoORM程式設計
- 如何批量使外來鍵(FK)失效
- 教你mysql如何增加外來鍵約束MySql
- sqlserver外來鍵SQLServer
- indexedDB 內鍵與外來鍵Index
- MYSQL的外來鍵MySql
- 外來鍵技術
- 如果新增欄位是外來鍵,如何處理?
- mysql中的外來鍵MySql
- 如何創造資料資產價值?如何對內賦能業務運營,對外創造市場價值?
- 父表修改與外來鍵的關係(主鍵DML與外來鍵的關係)
- 【c++】深賦值與淺賦值C++賦值
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- SQL的主鍵和外來鍵約束SQL
- Oracle根據主鍵查詢外來鍵Oracle
- mysql建立外來鍵語句MySql
- Oracle 外來鍵查詢sqlOracleSQL
- 10.30 索引,外來鍵索引
- 如何在MySQL資料庫中定義外來鍵ZMMySql資料庫
- 【實驗】【外來鍵】小議外來鍵約束對應用程式的影響
- 變數的賦值 指標間接賦值變數賦值指標
- 常被新手忽略的值賦值和引用賦值(偏redux向)賦值Redux
- 新的主鍵和外來鍵的語法
- Verilog連續賦值、過程賦值、過程連續賦值總結賦值
- 修改外來鍵為validate時需要驗證資料是否符合外來鍵約束
- 實現 MongoDB 外來鍵關聯MongoDB
- 資料庫外來鍵,用是不用?資料庫
- javascript變數賦值或者重新賦值注意事項JavaScript變數賦值
- 如何解決自增列賦值的問題賦值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-作為子程式引數來賦值SQL變數賦值
- 陣列賦值陣列賦值
- 解構賦值賦值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-使用賦值語句賦值SQL變數賦值
- java裡面給物件賦值,慎用賦值符號(=) (轉)Java物件賦值符號
- 資料庫:外來鍵是什麼資料庫
- 外來鍵缺索引檢查指令碼索引指令碼