TypeError krijgen: __init__() mist 1 vereist positioneel argument: ‘on_delete’ bij het toevoegen van bovenliggende tabel na onderliggende tabel met vermeldingen

Ik heb twee klassen in mijn sqlite-database, een bovenliggende tabel met de naam Categorieen de onderliggende tabel met de naam Article. Ik heb eerst de kindtabelklasse gemaakt en vermeldingen toegevoegd. Dus eerst had ik dit:

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

En nadat ik de bovenliggende tabel heb toegevoegd, en nu ziet mijn models.pyer zo uit:

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

Dus wanneer ik python manage.py makemigrations <my_app_name>uitvoer, krijg ik deze foutmelding:

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'

Ik heb soortgelijke problemen in StackOverflow gezien, maar het lijkt niet hetzelfde probleem: __ init __ () Ontbrekende 1 vereiste positionele argument: ‘Aantal’


Antwoord 1, Autoriteit 100%

U kunt het eigenschap wijzigen categorievan de Klasse ArticleLike This:

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

en de fout zou verdwijnen.

Misschien heb je misschien een andere optie nodig voor on_delete, controleer de documentatie voor meer details:

https: //docs.djangoproject .com / nl / 1.11 / ref / modellen / velden / # django.db.models.foreignkey

EDIT:

Zoals u in uw opmerking hebt vermeld, heeft u geen speciale vereisten voor on_delete, kunt u de optie DO_NOTHING:

gebruiken

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

Antwoord 2, Autoriteit 24%

Sinds Django 2.x, on_deleteis vereist.

Django Documentatie

Afwezig sinds versie 1.9: on_delete wordt een vereiste
Argument in Django 2.0. In oudere versies is het standaard in Cascade.


Antwoord 3, Autoriteit 6%

Van Django 2.0 on_deleteIS VEREIST:

Gebruiker = modellen.onetoonfield (gebruiker, on_delete = modellen.cascade)

Het verwijdert de kindertabelgegevens als de gebruiker wordt verwijderd. Controleer voor meer informatie de Django-documentatie.


Antwoord 4, Autoriteit 6%

Aangezien Django 2.0 het Foreigney-veld twee positionele argumenten vereist:

  1. het model naar de kaart naar
  2. het ANT_DELETE-argument
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

Hier zijn enkele methoden die worden gebruikt in on_delete

  1. cascade

Wiscade verwijdert. Django emuleert het gedrag van de SQL-beperking op het verwijderen van cascade en verwijdert ook het object dat het buitenlandse sleutel bevat

  1. Bescherm

Voorkom verwijderen van het voorwerp waarnaar wordt verwezen door protectedError, een subklasse van Django.db.integryErorEror te verhogen.

  1. do_nothing

Neem geen actie. Als uw database-backend referentiële integriteit verergeert, zal dit een IntegryError veroorzaken, tenzij u handmatig een SQL op Verwijderde Constraint toevoegen aan het databaseveld.

U kunt meer over On_Delete vinden door de Documentatie .


Antwoord 5, Autoriteit 2%

Als u buitenlandse sleutel gebruikt, moet u “on_delete = modellen.cascade” gebruiken omdat deze de complexiteit ontwikkeld zal worden die is ontwikkeld na het verwijderen van het originele element van de bovenliggende tabel. Zo eenvoudig als dat.

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

Antwoord 6

Hier zijn beschikbare opties als het iedereen voor On_Delete

helpt

Cascade, Do_nothing, Protect, Set, Set_default, Set_Null


Antwoord 7

Post Django versie 1.9, on_deleteWerd een vereist argument, d.w.z. van Django 2.0.

In oudere versies is het standaard in Cascade.

Dus, als u de functionaliteit die u in eerdere versies hebt gebruikt repliceren. Gebruik het volgende argument.

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

Dit heeft het hetzelfde effect als dat in eerdere versies was, zonder het expliciet op te geven.

officiële documentatie op andere argumenten die bij ON_Delete gaan


Antwoord 8

Als u niet weet welke optie de params wilt invoeren.
Wil gewoon de standaardwaarde houden zoals on_delete=Nonevóór migratie:

on_delete = modellen.cascade

Dit is een codefragment in de oude versie:

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

Antwoord 9

had een soortgelijk probleem dat opgelost is door beide twee parameters toe te voegen aan buitenlandse sleutel:
null = true, on_delete = modellen.set_null


Antwoord 10

Dit werkte voor mij
pip install django-csvimport --upgrade

Other episodes