天天看點

Django 2.0 model on_delete錯誤小記

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,如若轉載,請注來源