Получение TypeError: init () отсутствует 1 обязательный позиционный аргумент: "on delete" при попытке добавить родительскую таблицу после дочерней таблицы с записями
у меня есть два класса в моей базе данных sqlite, родительская таблица с именем Categorie
и дочерний стол называется Article
. Сначала я создал класс child table и добавляю записи. Итак, сначала у меня было следующее:
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
и после того, как я добавил родительскую таблицу, а теперь мой models.py
выглядит так:
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
поэтому, когда я бегу python manage.py makemigrations <my_app_name>
, Я получаю эту ошибку:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libsite-packagesdjango-2.0-py3.5.eggdjangocoremanagement__init__.py", line 354, in execute_from_command_line
utility.execute()
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libsite-packagesdjango-2.0-py3.5.eggdjangocoremanagement__init__.py", line 330, in execute
django.setup()
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libsite-packagesdjango-2.0-py3.5.eggdjango__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libsite-packagesdjango-2.0-py3.5.eggdjangoappsregistry.py", line 112, in populate
app_config.import_models()
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libsite-packagesdjango-2.0-py3.5.eggdjangoappsconfig.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "C:UserslislisAppDataLocalProgramsPythonPython35-32libimportlib__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:UserslislisDjangomon_siteblogmodels.py", line 6, in <module>
class Article(models.Model):
File "C:UserslislisDjangomon_siteblogmodels.py", line 16, in Article
categorie = models.ForeignKey('Categorie')
TypeError: __init__() missing 1 required positional argument: 'on_delete'
Я видел некоторые подобные проблемы в stackoverflow, но, похоже, это не та же проблема: _ _ init__ () отсутствует 1 необходимый позиционный аргумент:'quantity'
6 ответов
вы можете изменить свойство categorie
класса Article
такой:
categorie = models.ForeignKey(
'Categorie',
on_delete=models.CASCADE,
)
и ошибка должна исчезнуть.
в конце концов, вам может понадобиться другой вариант on_delete
, проверьте документацию для более подробной информации:
https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey
EDIT:
как вы заявили в своем комментарии, у вас нет особых требований к on_delete
, вы можете использовать опцию DO_NOTHING
:
# ...
on_delete=models.DO_NOTHING,
# ...
Начиная С Django 2.x, Это.
считается устаревшим, начиная с версии 1.9: on_delete станет обязательным аргумент в Django 2.0. В более старых версиях по умолчанию используется CASCADE.
Из Django 2.0 on_delete
требуется:
= модели пользователя.OneToOneField (пользователь, on_delete=модели.Каскад)
он удалит данные дочерней таблицы, если пользователь будет удален. Дополнительные сведения см. В документации Django.
до Django 1.9 модель будет выглядеть следующим образом:
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
иностранный ключ является полем Django для определения отношения "многие к одному".
до Django 1.9 поле ForeignKey требовало одного аргумента: модель для сопоставления.
С Джанго 2.0 the иностранный ключ поле требуется два позиционных аргумента:
1 - Модель для карты
2-в on_delete аргумент
для быстрого исправления "отсутствует 1 обязательный позиционный аргумент: on_delete" обновите модель:
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
после исправления ForeignKey вы сможете запускать миграции без каких-либо проблем:
python manage.py migrate
Если вы используете foreignkey, вам нужно использовать " on_delete=models.Каскад", поскольку он устранит сложность, возникшую после удаления исходного элемента из родительской таблицы. Все очень просто.
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
вот доступные параметры, если это помогает кому-либо для on_delete
CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL