강의로 돌아가기
김민수

무슨 에러인가요?TypeError: __init__() missing 1 required positional argument: 'on_delete'

poll = models.ForeignKey(Poll,ondelete=models.CASCADE) #Poll 모델의 id를 이용
candidate = models.ForeignKey(Candidate,on
delete=models.CASCADE)

이거를 써서 해결은 했지만 왜 저랑 몇몇 분들만 이런 이유가 나는지 그이유가 궁금하네요.

  • hur-kyuh-leez

    저도 같은 에러가 났어요. 찾아보셔서 알겠지만, 'poll이 없어질경우, poll을 foreign key로 지정한 애들은 다 같이 없애줘라' 이런거 같네요. 장고가 업데이트 되면서 직접 명시적으로 써줘야 되는 거 같습니다.

    hur-kyuh-leez―2018.07.21 07:12
  • 강민구

    간단히 말하면, ForeignKey 라는 부분은 다른 클라스를 참조합니다. 이때, on_delete의 역할은 만약 참조하고 있는 데이터의 삭제가 일어났을 때 어떻게 대처할 것인가를 묻는 것이라 보면 됩니다.

    강민구―2019.12.25 19:09
4 개의 답변
-

원래 DB에서 다른 테이블에 PK를 FK로 가져왔을 때 PK값을 지우고 싶은 경우 다른 테이블 FK값의 레코드가 먼저 삭제해야 삭제되거든요.
그래서 DB 설계시 on cascade를 써서 PK값이 삭제되면 FK의 레코드도 같이 삭제하는 걸 명시하는데,
위도 그와 관련된 에러같습니다.

하명기

class Choice(models.Model):
poll = models.ForeignKey(Poll,
ondelete=models.CASCADE,)
candidate = models.ForeignKey(Candidate,
on
delete=models.CASCADE,)
votes = models.IntegerField(default=0)

김도영
class Choice(models.Model):
    poll = models.ForeignKey(Poll,on_delete=models.CASCADE) #왜 애러가 날까?
    candidate = models.ForeignKey(Candidate,on_delete=models.CASCADE)
    votes = models.IntegerField(default=0)
  • Xeros

    감사합니다.

    Xeros―2020.01.05 08:11
강은호

foreignKey를 생성 할때 생성자에 on_delete 인자가 부족하다고 말합니다. 데이터 삭제시 액션을 지정 해줘야 하는것 같습니다.
models.py

from django.db import models

Create your models here.

class Candidate(models.Model):
name = models.CharField(maxlength=10)
introduction = models.TextField()
area = models.CharField(max
length=15)
party_number = models.IntegerField(default = 1)

def __str__(self):
    return self.name

class Poll(models.Model):
startdate = models.DateTimeField()
end
date = models.DateTimeField()
area = models.CharField(max_length = 15)

class Choice(models.Model):
poll = models.ForeignKey(Poll, ondelete=models.CASCADE,)
candidate = models.ForeignKey(Candidate, on
delete=models.CASCADE,)
votes = models.IntegerField(default = 0)

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.