it-swarm.com.de

Abrufen von TypeError: __init __ () fehlt 1 erforderliches Positionsargument: 'on_delete', wenn versucht wird, eine übergeordnete Tabelle nach einer untergeordneten Tabelle mit Einträgen hinzuzufügen

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'

70

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,
# ...
115
cezar

Seit Django 2.x, on_delete ist nötig.

Django-Dokumentation

Veraltet seit Version 1.9: on_delete wird ein erforderliches Argument in Django 2.0. In älteren Versionen wird standardmäßig CASCADE verwendet.

33

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

Danke an Valentino

10
Alex Jolig

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.

8
Javed Gouri

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)
5
Bala Kiswe

Seit Django 2.0 erfordert das ForeignKey-Feld zwei Positionsargumente:

  1. das zuzuordnende Modell
  2. das Argument on_delete
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

Hier sind einige Methoden, die in on_delete verwendet werden können

  1. KASKADE

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

  1. SCHÜTZEN

Verhindern Sie das Löschen des referenzierten Objekts, indem Sie ProtectedError, eine Unterklasse von Django.db.IntegrityError, auslösen.

  1. NICHTS TUN

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 .

4
Thusitha Deepal

Hier sind verfügbare Optionen, falls dies jemandem bei on_delete hilft

CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL

3
Tarun Behal

Das hat bei mir geklappt pip install Django-csvimport --upgrade

0
Mayank Jaiswal