[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 필드에는 두 개의 위치 인수가 필요합니다.
- 매핑 할 모델
- on_delete 인수
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
다음은 on_delete에서 사용할 수있는 몇 가지 방법입니다.
- 종속
계단식 삭제. Django는 SQL 제약 조건 ON DELETE CASCADE의 동작을 에뮬레이트하고 ForeignKey를 포함하는 개체도 삭제합니다.
- 보호
django.db.IntegrityError의 하위 클래스 인 ProtectedError를 발생시켜 참조 된 객체의 삭제를 방지합니다.
- 아무것도하지 마세요
아무 조치도 취하지 마십시오. 데이터베이스 백엔드가 참조 무결성을 적용하는 경우 데이터베이스 필드에 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)
이것은 명시 적으로 지정하지 않고 이전 버전과 동일한 효과를 갖습니다 .