ChatGPT解决这个技术问题 Extra ChatGPT

获取 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'

我在 stackoverflow 中看到了一些类似的问题,但似乎不是同一个问题:__init__() missing 1 required positional argument: 'quantity'

你使用的是哪个版本的 django?
那么你在这里有什么困惑?正如错误清楚地表明,ForeignKey 有一个必需的参数 on_delete。请参阅the docs
我不需要 on_delete 参数,它是强制性的吗?
@jochri3 是的,必需的位置参数意味着它是强制性的。查看文档以找出最适合您需求的选项。

c
cezar

您可以像这样更改类 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.ForeignKey

编辑:

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

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

on_delete=models.CASCADE 是 Django < 2 中的默认值
A
Andrey Zhilyakov

从 Django 2.x 开始,需要 on_delete

Django Documentation

1.9 版后已弃用:on_delete 将成为 Django 2.0 中的必需参数。在旧版本中,它默认为 CASCADE。


T
Thusitha Deepal

从 Django 2.0 开始,ForeignKey 字段需要两个位置参数:

映射到 on_delete 参数的模型

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

以下是一些可以在 on_delete 中使用的方法

级联

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

保护

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

没做什么

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

您可以通过阅读 documentation 找到有关 on_delete 的更多信息。


c
cezar

从 Django 2.0 on_delete 是必需的:

用户 = models.OneToOneField(用户,on_delete=models.CASCADE)

如果用户被删除,它将删除子表数据。有关更多详细信息,请查看 Django 文档。


为什么这个答案,而安德烈更早地回应了这个信息?
c
cezar

如果您使用外键,则必须使用“on_delete=models.CASCADE”,因为它将消除从父表中删除原始元素后产生的复杂性。就如此容易。

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

O
Optider

发布 Django 版本 1.9,on_delete 成为必需参数,即来自 Django 2.0。

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

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

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

这将具有与早期版本相同的效果,无需明确指定。

Official Documentation on other arguments that go with on_delete


T
Tarun Behal

如果它对 on_delete 的任何人有帮助,这里有可用的选项

级联、DO_NOTHING、保护、设置、SET_DEFAULT、SET_NULL


H
HoangYell

如果您不知道输入参数的选项。只想在迁移之前保留默认值,如 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

K
Kai - Kazuya Ito

从 Django 2.0 开始,“models.ForeignKey()”和“models.OneToOneField”必须有“on_delete”。例如下面:

“models.ForeignKey()”:

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

“models.OneToOneField”:

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

N
Nir Tsabar

通过将这两个参数添加到 ForeignKey 解决了类似的问题:null=True, on_delete=models.SET_NULL


a
anishtain4

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


M
Mayank Jaiswal

这对我有用pip install django-csvimport --upgrade


这如何回答这个问题?
嗨,马扬克。您可能做了其他事情来修复该错误,或者您使用的是早期版本的 django。
这可以通过为 models.ForeignKey 提供“on_delete”参数的值来解决
您使用的是版本 2 之前的 Django。因为所有以后的版本都强制使用 on_delete!默认情况下,在早期版本中,它是 on_delete = models.CASCADE

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅