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 Elterntabelle hinzugefügt habe, und jetzt mein models.py
sieht aus wie das:
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
Also, wenn ich laufe python manage.py makemigrations <my_app_name>
, Ich bekomme diesen Fehler:
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 Stackoverflow gesehen, aber es scheint nicht dasselbe Problem zu sein: __ init __ () fehlt 1 erforderliches Positionsargument: 'quantity'
Sie können die Eigenschaft categorie
der Klasse Article
folgendermaßen ändern:
categorie = models.ForeignKey(
'Categorie',
on_delete=models.CASCADE,
)
und der Fehler sollte verschwinden.
Möglicherweise benötigen Sie eine andere Option für on_delete
, überprüfen Sie die Dokumentation für weitere Details:
https://docs.djangoproject.com/de/1.11/ref/models/fields/#Django.db.models.ForeignKey
BEARBEITEN:
Wie Sie in Ihrem Kommentar angegeben haben, haben Sie keine besonderen Anforderungen an on_delete
, können Sie die Option DO_NOTHING
:
# ...
on_delete=models.DO_NOTHING,
# ...
Seit Django 2.x, on_delete
ist nötig.
Veraltet seit Version 1.9: on_delete wird ein erforderliches Argument in Django 2.0. In älteren Versionen wird standardmäßig CASCADE verwendet.
Bis zu Django 1.9 würde ein Modell folgendermaßen aussehen:
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 ist ein Django Feld zum Definieren einer 1: 1-Beziehung.
Bis zu Django 1.9 benötigte das ForeignKey-Feld ein einziges Argument: das Modell, dem es zugeordnet werden soll.
Seit Django 2.0 ist das ForeignKey -Feld erfordert zwei Positionsargumente :
1- Das Modell, dem Sie zuordnen möchten
2-das Argument on_delete
Aktualisieren Sie das Modell, um eine schnelle Lösung für "1 erforderliches Positionsargument fehlt: on_delete" zu finden:
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
Nach dem Beheben von ForeignKey können Sie problemlos Migrationen ausführen:
python manage.py migrate
Von Django 2.0 on_delete
ist nötig:
user = models.OneToOneField (User, on_delete = models.CASCADE)
Die untergeordneten Tabellendaten werden gelöscht, wenn der Benutzer gelöscht wird. Weitere Informationen finden Sie in der Dokumentation zu Django.
Wenn Sie einen Fremdschlüssel verwenden, müssen Sie "on_delete = models.CASCADE" verwenden, da dies die Komplexität beseitigt, die nach dem Löschen des ursprünglichen Elements aus der übergeordneten Tabelle entsteht. So einfach ist das.
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
Seit Django 2.0 erfordert das ForeignKey-Feld zwei Positionsargumente:
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
Hier sind einige Methoden, die in on_delete verwendet werden können
Cascade lö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 referenzielle Integrität erzwingt, führt dies zu einem IntegrityError, es sei denn, Sie fügen dem Datenbankfeld manuell eine SQL ON DELETE-Einschränkung hinzu.
weitere Informationen zu on_delete finden Sie in der Dokumentation .
Hier sind verfügbare Optionen, falls dies jemandem bei on_delete hilft
CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL
Das hat bei mir geklappt pip install Django-csvimport --upgrade