J'ai deux classes dans ma base de données sqlite, une table parent nommée Categorie
et la table enfant appelée Article
. J'ai créé d'abord la classe de table enfant et ajoute des entrées. Alors j'ai d'abord 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 parent, et maintenant 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
Donc, quand je cours python manage.py makemigrations <my_app_name>
, j'obtiens cette erreur:
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 vu des problèmes similaires dans stackoverflow, mais cela ne semble pas être le même problème: __init __ () manque 1 argument positionnel requis: 'quantité'
python
django
django-models
django-2.0
Christian Lisangola
la source
la source
on_delete
. Consultez la documentation .on_delete
paramètre, est-ce obligatoire?Réponses:
Vous pouvez modifier la propriété
categorie
de la classeArticle
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
ÉDITER:
Comme vous l'avez indiqué dans votre commentaire, pour lequel vous n'avez pas d'exigences particulières
on_delete
, vous pouvez utiliser l'optionDO_NOTHING
:# ... on_delete=models.DO_NOTHING, # ...
la source
Depuis Django 2.x,
on_delete
est requis.Documentation Django
la source
De Django 2.0
on_delete
est requis:Il supprimera les données de la table enfant si l'utilisateur est supprimé. Pour plus de détails, consultez la documentation de Django.
la source
Depuis Django 2.0, le champ ForeignKey nécessite deux arguments positionnels:
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
Voici quelques méthodes utilisables dans on_delete
Cascade supprime. Django émule le comportement de la contrainte SQL ON DELETE CASCADE et supprime également l'objet contenant le ForeignKey
Empêchez la suppression de l'objet référencé en levant ProtectedError, une sous-classe de django.db.IntegrityError.
Ne pas agir. Si votre backend de base de données applique l'intégrité référentielle, cela provoquera une erreur IntegrityError sauf si vous ajoutez manuellement une contrainte SQL ON DELETE au champ de base de données.
vous pouvez en savoir plus sur on_delete en lisant la documentation .
la source
Si vous utilisez une clé étrangère, vous devez utiliser "on_delete = models.CASCADE" car cela éliminera la complexité développée après la suppression de l'élément d'origine de la table parent. Aussi simple que cela.
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
la source
Voici les options disponibles si cela aide quelqu'un pour on_delete
la source
Donc, si vous souhaitez répliquer la fonctionnalité que vous avez utilisée dans les versions antérieures. Utilisez l'argument suivant.
categorie = models.ForeignKey('Categorie', on_delete = models.CASCADE)
Cela aura le même effet que dans les versions précédentes , sans le spécifier explicitement.
Documentation officielle sur les autres arguments associés à on_delete
la source
Si vous ne savez pas quelle option entrer les paramètres. Je veux simplement conserver la valeur par défaut comme
on_delete=None
avant la migration:Ceci est un extrait de code dans l'ancienne version:
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
la source
Un problème similaire a été résolu en ajoutant ces deux paramètres à ForeignKey: null = True, on_delete = models.SET_NULL
la source
Cela a fonctionné pour moi
pip install django-csvimport --upgrade
la source
on_delete
une contrainte! Par défaut dans les versions antérieures, c'étaiton_delete = models.CASCADE