先展示錯誤代碼,code:
1 from django.db import models 2 3 # Create your models here. 4 5 6 class BookInfo(models.Model): 7 """定義書籍信息模型類""" 8 9 # 設計name屬性 10 name = models.CharField(max_length=10) 11 12 13 class PeopleInfo(models.Model): 14 """定義人物信息類""" 15 16 name = models.CharField(max_length=10) 17 gender = models.BooleanField() 18 book = models.ForeignKey(BookInfo,)
報錯提示:
提示18行的ForeignKey缺少一個位置參數(position argument)---on_delete。
ForeignKey的聲明:
ForeignKey的實現:
錯誤的解決辦法,將錯誤代碼后面加上on_delete=models.CASCADE
1 book = models.ForeignKey(BookInfo, on_delete=models.CASCADE,)
從上面外鍵(ForeignKey)和一對一(OneToOneField)來看,都包含有on_delete這個參數。而且Django2.0之后,表與表之間關聯的時候,必須要寫on_delete參數,否則會報異常:
下面是django官方文檔的說明:
下面介紹以下on_delete的各個參數的值:
1 on_delete=None, # 刪除關聯表中的數據時,當前表與其關聯的field的行為 2 on_delete=models.CASCADE, # 刪除關聯數據,與之關聯也刪除,級聯刪除。Django模擬SQL約束ON DELETE CASCADE的行為,並刪除包含ForeignKey的對象。 3 on_delete=models.DO_NOTHING, # 刪除關聯數據,什么也不做 4 on_delete=models.PROTECT, # 刪除關聯數據,引發錯誤ProtectedError。通過引發ProtectedError
子類來 防止刪除引用的對象django.db.IntegrityError
。 5 # models.ForeignKey('關聯表', on_delete=models.SET_NULL, blank=True, null=True) 6 on_delete=models.SET_NULL, # 刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空,一對一同理) 7 # models.ForeignKey('關聯表', on_delete=models.SET_DEFAULT, default='默認值') 8 on_delete=models.SET_DEFAULT, # 刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值,一對一同理) 9 on_delete=models.SET, # 刪除關聯數據,自定義一個值。 10 a. 與之關聯的值設置為指定值,設置:models.SET(值) 11 b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
可參考官方文檔的說明:https://docs.djangoproject.com/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.on_delete
同時感謝以下兩位博主的文章:https://blog.csdn.net/kuangshp128/article/details/78946316