Получение 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, Это.

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

считается устаревшим, начиная с версии 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