programing

TypeError 가져오기: __init_() 항목이 있는 하위 테이블 뒤에 상위 테이블을 추가할 때 필요한 위치 인수 'on_delete'가 하나 누락되었습니다.

easyjava 2023. 5. 4. 20:44
반응형

TypeError 가져오기: __init_() 항목이 있는 하위 테이블 뒤에 상위 테이블을 추가할 때 필요한 위치 인수 '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'

스택 오버플로에서 유사한 문제를 몇 가지 보았지만 동일한 문제는 아닌 것 같습니다. __init__() 필수 위치 인수 1개 누락: 'quantity'

속성을 변경할 수 있습니다.categorie동급의Article다음과 같이:

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

오류가 사라져야 합니다.

결국 다음을 위한 다른 옵션이 필요할 수 있습니다.on_delete자세한 내용은 설명서를 참조하십시오.

인수 -- 모델 필드 참조 -- 장고 문서

당신이 코멘트에서 언급했듯이, 당신은 특별한 요구사항이 없습니다.on_delete당신은 그 옵션을 사용할 수 있습니다.DO_NOTHING:

# ...
on_delete=models.DO_NOTHING,
# ...

Django 2.x 이후로,on_delete필수 항목입니다.

장고 설명서

Django 2.0에서는 버전 1.9: on_delete 이후로 사용되지 않습니다.이전 버전에서는 기본적으로 CASCADE로 설정됩니다.

Django 2.0 이후 ForeignKey 필드에는 두 가지 위치 인수가 필요합니다.

  1. 지도에 표시할 모델
  2. on_delete 인수
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

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

  1. 캐스케이드

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

  1. 보호하다

django.db의 하위 클래스인 ProtectedError를 올려 참조된 개체를 삭제하지 않도록 합니다.무결성 오류입니다.

  1. 아무것도 하지 않음

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

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

Django 2.0에서on_delete필수 항목:

사용자 = 모델.OneToOneField(사용자, on_delete=가 필요합니다.캐스케이드)

사용자가 삭제되면 하위 테이블 데이터가 삭제됩니다.자세한 내용은 장고 설명서를 참조하십시오.

외부 키를 사용하는 경우 "on_delete="를 사용해야 합니다."CASCADE"는 부모 테이블에서 원래 요소를 삭제한 후 개발된 복잡성을 제거할 것이기 때문입니다.그것처럼 간단해.

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

버전 1.9, 장고버전 1.9,on_deleteDjango 2.0부터 필수 인수가 되었습니다.

이전 버전에서는 기본적으로 CASCADE로 설정됩니다.

이전 버전에서 사용한 기능을 복제하려는 경우다음 인수를 사용합니다.

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

이는 명시적으로 지정하지 않고 이전 버전과 동일한 효과를 제공합니다.

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

다음은 on_delete에 대해 도움이 되는 사용 가능한 옵션입니다.

캐스케이드, DO_NOTHING, PROTECT, SET_DEFAULT, SET_NULL

어떤 옵션을 입력해야 할지 모르는 경우.다음과 같은 기본값을 유지하기를 원합니다.on_delete=None마이그레이션 전:

on_delete=hostname에 있습니다.캐스케이드

다음은 이전 버전의 코드 조각입니다.

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

"어쨌든.외부()" 및 "모델".장고 2.0 이후 OneToOneField는 "on_delete"여야 합니다.아래의 예:

"어쨌든.외부():

categories = models.ForeignKey('Category', on_delete=models.CASCADE)

"어쨌든.일대일 필드":

categories = models.OneToOneField('Category', on_delete=models.PROTECT)

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

나에게 패키지 관리자는 해결했습니다.djangorestframework과 더그버로리고으전은낮▁a▁to.authtoken모델에 on_delete가 없습니다.제 모델들은 모두 좋았습니다.실행할 수 있습니다.django.apps.apps.get_models()모든 모델 목록을 가져와 어떤 라이브러리가 자체 모델을 생성하는지 확인하고 문제가 될 수 있습니다.

이것은 나에게 효과가 있었습니다.pip install django-csvimport --upgrade

언급URL : https://stackoverflow.com/questions/44026548/getting-typeerror-init-missing-1-required-positional-argument-on-delete

반응형