Diango: TypeError: __init__() missing 1 required positional argument: 'on_delete'

一、问题

Django 中使用数据库布局的过程中,在 startapp 命令创建的 models.py 文件中输入例如下述内容:

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

提示错误:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

二、方法

修改上述代码为:

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    publication_date = models.DateField()

即,在 ForeignKey() 方法中添加 on_delete 参数。

三、原因

(一)多对一(ForeignKey)

通过查看 ForeignKey 类,可以看到一个多对一关系中,要求至少两个参数:模型要关联的类、on_delete 选项。

class ForeignKey(ForeignObject):
    def __init__(self, to, on_delete, related_name=None, related_query_name=None,
                     limit_choices_to=None, parent_link=False, to_field=None,
                     db_constraint=True, **kwargs):

(二)on_delete:常见参数值

 

  1. CASCADE:级联删除,模仿 SQL 约束 ON DELETE CASCADE ,同时删除关联数据;
  2. PROTECT:防止删除,当删除关联数据时,报错(ProtectedError);
  3. SET_NULL:当删除关联数据时,将外键设置为 null
  4. SET_DEFAULT:当删除关联数据时,将外键设置为默认值,该默认值必须设置;
  5. SET():通过执行 SET 中的方法,获取返回的值;
  6. DO_NOTHING:什么都不做。

更多信息请看官方文档:https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值