it-swarm.com.ru

Получение 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 обязательный позиционный аргумент: "количество"

67
Christian Lisangola

Вы можете изменить свойство 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,
# ...
107
cezar

Поскольку Django 2.x, on_delete требуется.

Документация Django

Устаревший с версии 1.9: on_delete станет обязательным аргументом в Django 2.0. В старых версиях по умолчанию используется CASCADE.

31
Andrey Zhilyakov

Вплоть до 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. поле 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

Спасибо Валентино

9
Alex Jolig

С Django 2.0 on_delete требуется:

user = models.OneToOneField (Пользователь, on_delete = models.CASCADE)

Он удалит данные дочерней таблицы, если пользователь будет удален. Для получения более подробной информации смотрите документацию Django.

7
Javed Gouri

Если вы используете foreignkey, тогда вы должны использовать "on_delete = models.CASCADE", так как это устранит сложность, возникшую после удаления исходного элемента из родительской таблицы. Так просто.

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

Вот доступные варианты, если это кому-нибудь поможет для on_delete

CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL

3
Tarun Behal

Поскольку Django 2.0 поле ForeignKey требует двух позиционных аргументов:

  1. модель для сопоставления
  2. аргумент on_delete
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

Вот некоторые методы, которые можно использовать в on_delete

  1. CASCADE

Каскад удаляет. Django эмулирует поведение ограничения SQL ON DELETE CASCADE, а также удаляет объект, содержащий ForeignKey

  1. PROTECT

Предотвратите удаление ссылочного объекта, подняв ProtectedError, подкласс Django.db.IntegrityError.

  1. НИЧЕГО НЕ ДЕЛАТЬ

Не предпринимай никаких действий. Если ваш сервер базы данных обеспечивает ссылочную целостность, это вызовет IntegrityError, если вы вручную не добавите ограничение SQL ON DELETE в поле базы данных.

вы можете узнать больше об on_delete, прочитав документация .

2
Thusitha Deepal

Это сработало для меня pip install Django-csvimport --upgrade

0
Mayank Jaiswal