Получение TypeError: __init __() отсутствует 1 требуемый позиционный аргумент: 'on_delete' при попытке добавить родительскую таблицу после дочерней таблицы с записями
У меня есть два класса в моей базе данных sqlite, родительская таблица с именем Categorie
и дочерняя таблица под названием Article
. Сначала я создал класс дочерних таблиц и добавлял записи. Поэтому сначала у меня было это:
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:\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'
Я видел некоторые подобные проблемы в stackoverflow, но, похоже, это не проблема: __init __() отсутствует 1 обязательный позиционный аргумент: 'количество'
Ответы
Ответ 1
Вы можете изменить 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
РЕДАКТИРОВАТЬ:
Как вы указали в своем комментарии, что у вас нет особых требований для on_delete
, вы можете использовать опцию DO_NOTHING
:
# ...
on_delete=models.DO_NOTHING,
# ...
Ответ 2
Поскольку Django 2.x требуется on_delete
.
Документация Django
Устаревший с версии 1.9: on_delete станет обязательным аргументом в Django 2.0. В старых версиях по умолчанию используется CASCADE.
Ответ 3
Вплоть до 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
ForeignKey - это поле Django для определения отношений многие-к-одному.
Вплоть до Django 1.9 поле ForeignKey требовало одного аргумента: модель для сопоставления.
Начиная с Django 2.0 поле ForeignKey требует двух позиционных аргументов:
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
Благодаря валентино
Ответ 4
Из Django 2.0 on_delete
требуется:
user = models.OneToOneField (Пользователь, on_delete = models.CASCADE)
Он удалит данные дочерней таблицы, если Пользователь будет удален. Подробнее см. Документацию Django.
Ответ 5
Если вы используете foreignkey, вы должны использовать "on_delete = models.CASCADE", так как это устранит сложность, возникшую после удаления исходного элемента из родительской таблицы. Так просто.
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
Ответ 6
Вот доступные варианты, если это помогает любому пользователю on_delete
CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL
Ответ 7
Начиная с Django 2.0 поле ForeignKey требует двух позиционных аргументов:
- модель для сопоставления
- аргумент on_delete
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
Вот некоторые методы, которые можно использовать в on_delete
- CASCADE
Каскад удаляет. Django эмулирует поведение ограничения SQL ON DELETE CASCADE, а также удаляет объект, содержащий ForeignKey
- PROTECT
Предотвратите удаление ссылочного объекта, подняв ProtectedError, подкласс django.db.IntegrityError.
- НИЧЕГО НЕ ДЕЛАТЬ
Не предпринимай никаких действий. Если ваш сервер базы данных обеспечивает ссылочную целостность, это вызовет IntegrityError, если вы вручную не добавите ограничение SQL ON DELETE в поле базы данных.
Вы можете узнать больше об on_delete, прочитав документацию.
Ответ 8
Это сработало для меня pip install django-csvimport --upgrade