1、前言
今天用 Django 2.0 時模型的外鍵報了一個錯誤:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
2、原因
經過篩查,在建立多對一的關系的,需要在
Foreign
的第二參數中加入
on_delete=models.CASCADE
主外關系鍵中,級聯删除,也就是當删除主表的資料時候從表中的資料也随着一起删除。
on_delete參數的各個值(可選的值都内置在django.db.models中)的含義:
- CASCADE:級聯删除,模拟SQL語言中的ON DELETE CASCADE限制,将定義有外鍵的模型對象同時删除!
- PROTECT: 保護模式,阻止上面的删除操作,但是彈出ProtectedError異常
- SET_NULL:置空模式,将外鍵字段設為null,隻有當字段設定了null=True時,方可使用該值。
- SET_DEFAULT: 置預設值,将外鍵字段設為預設值。隻有當字段設定了default參數時,方可使用。
- DO_NOTHING:什麼也不做。
- SET():設定為一個傳遞給SET()的值或者一個回調函數的傳回值,注意大小寫。自定義一個值,該值當然隻能是對應的實體。
示例:
author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
關于SET()的使用:
**官方案例**
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
參考
- on_delete=models.CASCADE級聯删除 - CSDN部落格
- django資料模型中關于on_delete的使用 - CSDN部落格
- django2.0 關聯表的必填on_delete參數的含義 - CSDN部落格
- django 關系類型字段 - 劉江的django教程
- 如有疑問,歡迎在評論區一起讨論!
- 如有不正确的地方,歡迎指導!
注:本文首發于 iHTCboy's blog,如若轉載,請注來源