TypeError 가져 오기 : __init __ () 필수 위치 인수 1 개 누락 : 항목이있는 자식 테이블 뒤에 부모 테이블을 추가하려고 할 때 'on_delete'


96

내 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 개의 필수 위치 인수 누락 : 'quantity'


3
어떤 버전의 장고를 사용하고 있습니까?
alfonso.kim

2
그래서 여기서 무엇을 헷갈 리나요? 오류가 분명히 말했듯이 ForeignKey에는 필수 인수 인 on_delete. 문서를 참조하십시오 .
Daniel Roseman

on_delete매개 변수 가 필요하지 않습니다. 필수인가요?
Christian Lisangola

@ jochri3 예, 필수 위치 인수 는 필수임을 의미합니다. 귀하의 요구에 가장 적합한 옵션을 찾으려면 설명서를 확인하십시오.
세자르

답변:


176

다음 과 같이 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,
# ...

1
on_delete = models.CASCADE는 Django <2
Peter F

47

Django 2.x부터 on_delete 필수입니다.

장고 문서

버전 1.9부터 폐지 : on_delete는 Django 2.0에서 필수 인수가됩니다. 이전 버전에서는 기본값이 CASCADE입니다.


12

Django 2.0 on_delete이 필요합니다.

사용자 = models.OneToOneField (User, on_delete = models.CASCADE)

사용자가 삭제되면 하위 테이블 데이터도 삭제됩니다. 자세한 내용은 Django 문서를 확인하세요.


1
Andrey가이 정보로 이전에 응답하는 동안 왜이 대답이 있습니까?
Samuel Dauzon

11

Django 2.0부터 ForeignKey 필드에는 두 개의 위치 인수가 필요합니다.

  1. 매핑 할 모델
  2. on_delete 인수
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

다음은 on_delete에서 사용할 수있는 몇 가지 방법입니다.

  1. 종속

계단식 삭제. Django는 SQL 제약 조건 ON DELETE CASCADE의 동작을 에뮬레이트하고 ForeignKey를 포함하는 개체도 삭제합니다.

  1. 보호

django.db.IntegrityError의 하위 클래스 인 ProtectedError를 발생시켜 참조 된 객체의 삭제를 방지합니다.

  1. 아무것도하지 마세요

아무 조치도 취하지 마십시오. 데이터베이스 백엔드가 참조 무결성을 적용하는 경우 데이터베이스 필드에 SQL ON DELETE 제약 조건을 수동으로 추가하지 않는 한 IntegrityError가 발생합니다.

on_delete에 대한 자세한 내용은 설명서를 참조하십시오 .


4

foreignkey를 사용하는 경우 "on_delete = models.CASCADE"를 사용해야합니다. 이는 상위 테이블에서 원래 요소를 삭제 한 후 개발 된 복잡성을 제거하기 때문입니다. 저것과 같이 쉬운.

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

3

on_delete에 대해 누구에게나 도움이되는 경우 사용 가능한 옵션이 있습니다.

CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL


1

Django 버전 1.9 이후 on_delete, 즉 Django 2.0에서 필수 인수가되었습니다.

이전 버전에서는 기본값이 CASCADE입니다.

따라서 이전 버전에서 사용한 기능을 복제하려는 경우. 다음 인수를 사용하십시오.

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

이것은 명시 적으로 지정하지 않고 이전 버전과 동일한 효과를 갖습니다 .

on_delete와 함께 사용되는 다른 인수에 대한 공식 문서


0

매개 변수를 입력 할 옵션을 모르는 경우. on_delete=None마이그레이션 전과 같이 기본값을 유지하고 싶습니다 .

on_delete = models.CASCADE

다음은 이전 버전의 코드 스 니펫입니다.

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

0

이 두 매개 변수를 ForeignKey에 추가하여 해결 된 유사한 문제가있었습니다. null = True, on_delete = models.SET_NULL


-3

이것은 나를 위해 일했습니다. pip install django-csvimport --upgrade


2
이것은 질문에 어떻게 대답합니까?
cezar

안녕하세요 Mayank. 해당 오류를 수정하기 위해 다른 작업을 수행했거나 이전 버전의 django를 사용하고있을 것입니다.
Chris Dare

이 문제는 "on_delete"인수에 대한 값을 모델에 제공하여 해결됩니다 .ForeignKey
Chris Dare

당신은 버전 2 이전의 Django를 사용하고 있습니다. 이후의 모든 릴리스가 on_delete강제를 만들었 기 때문입니다 ! 이전 버전에서는 기본적으로on_delete = models.CASCADE
Optider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.