Ich habe zwei Klassen in meiner SQLite-Datenbank, eine übergeordnete Tabelle mit dem Namen Categorie
und die untergeordnete Tabelle mit dem Namen Article
. Ich habe zuerst die untergeordnete Tabellenklasse erstellt und Einträge hinzugefügt. Also hatte ich zuerst folgendes:
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
Und nachdem ich die übergeordnete Tabelle hinzugefügt habe und jetzt meine so models.py
aussieht:
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
Wenn ich laufe python manage.py makemigrations <my_app_name>
, erhalte ich folgende Fehlermeldung:
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'
Ich habe einige ähnliche Probleme im Stapelüberlauf gesehen, aber es scheint nicht dasselbe Problem zu sein: __init __ () fehlt 1 erforderliches Positionsargument: 'Quantität'
python
django
django-models
django-2.0
Christian Lisangola
quelle
quelle
on_delete
. Siehe die Dokumente .on_delete
Parameter nicht, ist er obligatorisch?Antworten:
Sie können die Eigenschaft
categorie
der Klasse folgendermaßen ändernArticle
:und der Fehler sollte verschwinden.
Möglicherweise benötigen Sie eine andere Option
on_delete
für. Weitere Informationen finden Sie in der Dokumentation:https://docs.djangoproject.com/de/1.11/ref/models/fields/#django.db.models.ForeignKey
BEARBEITEN:
Wie Sie in Ihrem Kommentar angegeben haben, für die Sie keine besonderen Anforderungen haben
on_delete
, können Sie die folgende Option verwendenDO_NOTHING
:quelle
Da ist Django 2.x
on_delete
erforderlich.Django-Dokumentation
quelle
Ab Django 2.0
on_delete
ist erforderlich:Die untergeordneten Tabellendaten werden gelöscht, wenn der Benutzer gelöscht wird. Weitere Informationen finden Sie in der Django-Dokumentation.
quelle
Seit Django 2.0 erfordert das ForeignKey-Feld zwei Positionsargumente:
Hier sind einige Methoden, die in on_delete verwendet werden können
Kaskade wird gelöscht. Django emuliert das Verhalten der SQL-Einschränkung ON DELETE CASCADE und löscht auch das Objekt, das den ForeignKey enthält
Verhindern Sie das Löschen des referenzierten Objekts, indem Sie ProtectedError, eine Unterklasse von django.db.IntegrityError, auslösen.
Nimm keine Aktion. Wenn Ihr Datenbank-Backend die referenzielle Integrität erzwingt, führt dies zu einem IntegrityError, sofern Sie dem Datenbankfeld nicht manuell eine SQL ON DELETE-Einschränkung hinzufügen.
Weitere Informationen zu on_delete finden Sie in der Dokumentation .
quelle
Wenn Sie einen Fremdschlüssel verwenden, müssen Sie "on_delete = models.CASCADE" verwenden, da dadurch die Komplexität beseitigt wird, die nach dem Löschen des ursprünglichen Elements aus der übergeordneten Tabelle entsteht. So einfach ist das.
quelle
Hier sind verfügbare Optionen, wenn es jemandem bei on_delete hilft
quelle
Wenn Sie also die Funktionalität replizieren möchten, die Sie in früheren Versionen verwendet haben. Verwenden Sie das folgende Argument.
Dies hat den gleichen Effekt wie in früheren Versionen , ohne dass dies explizit angegeben wird.
Offizielle Dokumentation zu anderen Argumenten, die zu on_delete gehören
quelle
Wenn Sie nicht wissen, welche Option Sie eingeben sollen. Ich möchte nur den Standardwert wie
on_delete=None
vor der Migration beibehalten:Dies ist ein Code-Snippet in der alten Version:
quelle
Hatte ein ähnliches Problem, das durch Hinzufügen dieser beiden Parameter zu ForeignKey behoben wurde: null = True, on_delete = models.SET_NULL
quelle
Das hat bei mir funktioniert
pip install django-csvimport --upgrade
quelle
on_delete
einen Zwang gemacht haben! In früheren Versionen war es standardmäßigon_delete = models.CASCADE