python - apprendre - Obtenir TypeError:__init__() manquant 1 argument positionnel requis: 'on_delete' lors de la tentative d'ajout d'une table parent après une table enfant avec des entrées




django website (6)

À partir de Django 2.0, on_delete est requis:

user = models.OneToOneField (User, on_delete = models.CASCADE)

Il supprimera les données de la table enfant si l'utilisateur est supprimé. Pour plus de détails, consultez la documentation de Django.

J'ai deux classes dans ma base de données sqlite, une table parente nommée Categorie et la table enfant appelée Article . J'ai d'abord créé la classe de la table enfant et ajouté des entrées. Alors d'abord j'ai eu ceci:

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

Et après avoir ajouté la table parente, mon models.py ressemble à ceci:

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

Ainsi, lorsque python manage.py makemigrations <my_app_name> , le 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'

J'ai rencontré des problèmes similaires dans stackoverflow, mais il semble que ce ne soit pas le même problème: __init __ () manque 1 argument de positionnement requis: 'quantité'


Cela a fonctionné pour moi pip install django-csvimport --upgrade


Depuis Django 2.x, on_delete est requis.

Documentation Django

Déconseillé depuis la version 1.9: on_delete deviendra un argument obligatoire dans Django 2.0. Dans les versions antérieures, CASCADE est utilisé par défaut.


Jusqu'à Django 1.9, un modèle ressemblerait à ceci:

from django.db import models
class Article(models.Model):
    category = models.ForeignKey(Category)
    title =  models.CharField(max_length=55)
    # ...

    def __str__(self):
        return self.title

ForeignKey est un champ Django permettant de définir une relation plusieurs à un.

Jusqu'à Django 1.9, le champ ForeignKey nécessitait un seul argument: le modèle à mapper.

Depuis Django 2.0, le champ ForeignKey nécessite deux arguments de position :

1- le modèle à mapper à

2-l'argument on_delete

Pour résoudre rapidement «l'argument positionnel manquant 1 requis: on_delete», mettez à jour le modèle:

from django.db import models
class Article(models.Model):
    category = models.ForeignKey('Category', on_delete=models.PROTECT)
    title =  models.CharField(max_length=55)
    # ...

    def __str__(self):
        return self.title

Après avoir corrigé ForeignKey, vous pourrez exécuter les migrations sans problème:

python manage.py migrate

Merci à Valentino


Voici les options disponibles si ça aide quelqu'un pour on_delete

CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL


Vous pouvez modifier la categorie de propriétés de la classe Article comme ceci:

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

et l'erreur devrait disparaître.

Finalement, vous pourriez avoir besoin d’une autre option pour on_delete , consultez la documentation pour plus de détails:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey

MODIFIER:

Comme vous l'avez indiqué dans votre commentaire, que vous n'avez aucune exigence particulière pour on_delete , vous pouvez utiliser l'option DO_NOTHING :

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