Python 获取TypeError:uuu init_uuuu()缺少1个必需的位置参数:';删除';尝试在包含条目的子表之后添加父表时
我的sqlite数据库中有两个类,一个名为Python 获取TypeError:uuu init_uuuu()缺少1个必需的位置参数:';删除';尝试在包含条目的子表之后添加父表时,python,django,django-models,django-2.0,Python,Django,Django Models,Django 2.0,我的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.Date
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
categorie = models.ForeignKey(
'Categorie',
on_delete=models.CASCADE,
)
因此,当我运行python manage.py makemigrations
时,会出现以下错误:
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'
回溯(最近一次呼叫最后一次):
文件“manage.py”,第15行,在
从命令行(sys.argv)执行命令
文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site packages\django-2.0-py3.5.egg\django\core\management\\ uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
utility.execute()
文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site packages\django-2.0-py3.5.egg\django\core\management\\ uuuuu init\uuuuuu.py”,第330行,执行
django.setup()
文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site packages\django-2.0-py3.5.egg\django\\ uuuuuuu init\ uuuuuuuu.py”,第24行,在安装程序中
应用程序。填充(设置。已安装的应用程序)
文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site packages\django-2.0-py3.5.egg\django\apps\registry.py”,第112行,在填充中
app_config.import_models()
导入模型中的文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site packages\django-2.0-py3.5.egg\django\apps\config.py”第198行
self.models\u module=导入模块(models\u module\u name)
文件“C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\importlib\ \uuuuuu init\uuuuuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第986行,在_gcd_import中
文件“”,第969行,在“查找”和“加载”中
文件“”,第958行,在“查找”和“加载”中解锁
文件“”,第673行,在“加载”中
exec_模块中第665行的文件“”
文件“”,第222行,在已删除帧的调用中
文件“C:\Users\lislis\Django\mon\u site\blog\models.py”,第6行,在
类文章(models.Model):
文件“C:\Users\lislis\Django\mon\u site\blog\models.py”,第16行,在文章中
categorie=models.ForeignKey('categorie')
TypeError:\uuuu init\uuuu()缺少1个必需的位置参数:“on\u delete”
我在stackoverflow中看到了一些类似的问题,但似乎不是同一个问题:您可以像这样更改类
文章的属性category
:
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
categorie = models.ForeignKey(
'Categorie',
on_delete=models.CASCADE,
)
错误应该消失
最后,您可能需要在_delete
上为添加另一个选项,有关详细信息,请查看文档:
编辑:
正如您在评论中所述,您对删除上的没有任何特殊要求,您可以使用选项不做任何事
:
# ...
on_delete=models.DO_NOTHING,
# ...
由于Django 2.x,因此需要删除上的
自1.9版以来已弃用:on_delete将成为必填项
Django 2.0中的参数。在旧版本中,它默认为级联
从Django 2.0的中删除是必需的:
user=models.OneToOneField(用户,on_delete=models.CASCADE)
如果用户被删除,它将删除子表数据。有关更多详细信息,请查看Django文档。如果使用foreignkey,则必须使用“on_delete=models.CASCADE”,因为它将消除从父表中删除原始元素后产生的复杂性。就这么简单
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
这里有一些可用的选项,如果它有助于任何人进行on_delete
级联、不执行任何操作、保护、设置、设置默认值、设置空值
由于Django 2.0,ForeignKey字段需要两个位置参数:
要映射到的模型
on_delete参数
categorie=models.ForeignKey('categorie',on_delete=models.PROTECT)
这里有一些方法可以用于on_delete
级联
级联删除。Django在DELETE CASCADE上模拟SQL约束的行为,并删除包含ForeignKey的对象
保护
通过引发ProtectedError(django.db.IntegrityError的子类)防止删除引用的对象
什么也不做
不要采取行动。如果数据库后端强制引用完整性,这将导致IntegrityError,除非手动向数据库字段添加SQL ON DELETE约束
您可以通过阅读有关删除的详细信息。这对我很有用
pip安装django csvimport——如果您不知道输入参数的选项,请升级。
只需在迁移之前保留默认值,如_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之后,删除时的成为必需参数,即来自Django 2.0
在旧版本中,它默认为级联
因此,如果您想复制在早期版本中使用的功能。使用以下参数
categorie = models.ForeignKey('Categorie', on_delete = models.CASCADE)
这将产生与早期版本相同的效果,而无需明确指定
您使用的是哪种版本的django?那么您在这里对什么感到困惑呢?正如错误明确指出的,ForeignKey有一个必需的参数,on\u delete
。请参阅。我不需要关于_delete的参数,它是强制性的吗?@jochri3是的,必需的位置参数表示它是强制性的。查看文档,找出哪个选项最适合您的需要。为什么回答这个问题,而Andrey在前面用这些信息回答?这是如何回答问题的?嗨,Mayank。您可能做了其他事情来修复该错误,或者您正在使用django的早期版本。这由supply解决