[python] 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 개의 필수 위치 인수 누락 : ‘quantity’



답변

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


답변

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

장고 문서

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


답변

Django 2.0 on_delete이 필요합니다.

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

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


답변

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에 대한 자세한 내용은 설명서를 참조하십시오 .


답변

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

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


답변

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

CASCADE, DO_NOTHING, PROTECT, SET, SET_DEFAULT, SET_NULL


답변

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

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

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

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

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

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