Ik heb twee klassen in mijn sqlite-database, een bovenliggende tabel met de naam Categorie
en 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.py
er 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 categorie
van de Klasse Article
Like 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:
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_delete
is vereist.
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_delete
IS 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:
- het model naar de kaart naar
- het ANT_DELETE-argument
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
Hier zijn enkele methoden die worden gebruikt in on_delete
- 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
- Bescherm
Voorkom verwijderen van het voorwerp waarnaar wordt verwezen door protectedError, een subklasse van Django.db.integryErorEror te verhogen.
- 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_delete
Werd 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=None
vóó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