获取 TypeError:__ init__()缺少1个必需的位置参数: “ on_delete”,试图在带条目的子表之后添加父表

在 sqlite 数据库中有两个类,一个是名为 Categorie的父表,另一个是名为 Article的子表。我首先创建了子表类并添加了条目。首先我想到了这个:

class Article(models.Model):
titre=models.CharField(max_length=100)
auteur=models.CharField(max_length=42)
contenu=models.TextField(null=True)
date=models.DateTimeField(
auto_now_add=True,
auto_now=False,
verbose_name="Date de parution"
)


def __str__(self):
return self.titre

在我添加了父表之后,现在我的 models.py看起来像这样:

from django.db import models


# Create your models here.
class Categorie(models.Model):
nom = models.CharField(max_length=30)


def __str__(self):
return self.nom




class Article(models.Model):
titre=models.CharField(max_length=100)
auteur=models.CharField(max_length=42)
contenu=models.TextField(null=True)
date=models.DateTimeField(
auto_now_add=True,
auto_now=False,
verbose_name="Date de parution"
)
categorie = models.ForeignKey('Categorie')


def __str__(self):
return self.titre

所以当我运行 python manage.py makemigrations <my_app_name>时,我得到这个错误:

Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 354, in execute_from_command_line
utility.execute()
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 330, in execute
django.setup()
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\registry.py", line 112, in populate
app_config.import_models()
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "C:\Users\lislis\Django\mon_site\blog\models.py", line 6, in <module>
class Article(models.Model):
File "C:\Users\lislis\Django\mon_site\blog\models.py", line 16, in Article
categorie = models.ForeignKey('Categorie')
TypeError: __init__() missing 1 required positional argument: 'on_delete'

我在堆栈溢出中看到过一些类似的问题,但似乎不是同一个问题: _ _ init _ _ ()缺少一个必需的位置参数:

210952 次浏览

您可以像下面这样更改类 Article的属性 categorie:

categorie = models.ForeignKey(
'Categorie',
on_delete=models.CASCADE,
)

错误应该消失。

最终你可能需要 on_delete的另一个选项,查看文档了解更多细节:

Https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models 外国钥匙

编辑:

正如您在评论中所说,您对 on_delete没有任何特殊要求,您可以使用选项 DO_NOTHING:

# ...
on_delete=models.DO_NOTHING,
# ...

由于 Django 2. x,on_delete是必需的。

姜戈文档

由于版本1.9: on _ delete 将成为必需版本,因此不推荐使用 在 Django 2.0版本中,它默认为 CASCADE。

从 Django 2.0 on_delete是必需的:

User = model. OneToOneField (User,on _ delete = model. CASCADE)

如果用户被删除,它将删除子表数据。

如果您使用的是外键,那么您必须使用“ on _ delete = model. CASCADE”,因为它将消除从父表中删除原始元素后产生的复杂性。就这么简单。

categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)

如果对 on _ delete 有帮助,以下是可用的选项

级联,DO _ Nothing,保护,设置,设置 _ 缺省值,设置 _ 空

自 Django 2.0以来,ForeignKey 字段需要两个位置参数:

  1. 要映射到的模型
  2. On _ delete 参数
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

下面是在 on _ delete 中可以使用的一些方法

  1. CASCADE

级联删除。Django 模拟 SQL 约束 ON DELETE CASCADE 的行为,并删除包含 ForeignKey 的对象

  1. 保护

通过引发 ProtectedError (django.db.IntegrityError 的子类)来防止删除引用的对象。

  1. 什么都不做

不要采取行动。如果您的数据库后端强制执行参照完整性,这将导致 IntegrityError,除非您手动向数据库字段添加 SQL ON DELETE 约束。

通过阅读 文件,您可以找到更多关于 on _ delete 的信息。

这招对我很管用 pip install django-csvimport --upgrade

如果您不知道输入参数的选项。 只是希望在迁移之前保留像 on_delete=None这样的默认值:

On _ delete = models.CASCADE

这是旧版本中的一段代码:

if on_delete is None:
warnings.warn(
"on_delete will be a required arg for %s in Django 2.0. Set "
"it to models.CASCADE on models and in existing migrations "
"if you want to maintain the current default behavior. "
"See https://docs.djangoproject.com/en/%s/ref/models/fields/"
"#django.db.models.ForeignKey.on_delete" % (
self.__class__.__name__,
get_docs_version(),
),
RemovedInDjango20Warning, 2)
on_delete = CASCADE

通过在 ForeignKey 中添加这两个参数解决了类似的问题: Null = True,on _ delete = models.SET _ NULL

在 Django 版本1.9之后,on_delete成为必需的参数,即从 Django 2.0开始。

在旧版本中,它默认为 CASCADE。

因此,如果您想要复制您在早期版本中使用的功能,请使用以下参数。

categorie = models.ForeignKey('Categorie', on_delete = models.CASCADE)

这将包含 < strong > 与早期版本相同的效果 ,而不需要显式地指定它。

关于与 on _ delete 相关的其他参数的官方文档

对我来说,包管理器将 djangorestframework解析为一个较低的版本,而 authtoken模型没有 on _ delete。我所有的模特都很棒。您可以运行 django.apps.apps.get_models()获取所有模型的列表,以查看哪些库创建自己的模型,这可能是问题所在。

“ model. ForeignKey ()”“模特. OneToOneField”必须从 姜戈2.0开始就有 “ on _ delete”。例如:

“ model. ForeignKey ()” :

categories = models.ForeignKey('Category', on_delete=models.CASCADE)

“ model. OneToOneField” :

categories = models.OneToOneField('Category', on_delete=models.PROTECT)

用简单的单词告诉 Django 如何处理依赖于您删除的模型实例的模型实例。它被询问是因为如果您引用的表数据被删除,那么如果引用表点删除的数据,应该发生什么

应该是的

categories = models.ForeignKey('Category', on_delete=models.CASCADE)

根据需要选择的一些不同类型的 on _ delete

  1. CASCADE
  2. 保护
  3. SET _ NULL