一、问题
在 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:常见参数值
- CASCADE:级联删除,模仿 SQL 约束 ON DELETE CASCADE ,同时删除关联数据;
- PROTECT:防止删除,当删除关联数据时,报错(ProtectedError);
- SET_NULL:当删除关联数据时,将外键设置为 null ;
- SET_DEFAULT:当删除关联数据时,将外键设置为默认值,该默认值必须设置;
SET
():通过执行 SET 中的方法,获取返回的值;- DO_NOTHING:什么都不做。
更多信息请看官方文档:https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey