참고로, on_delete
모델 의 매개 변수는 원래의 소리와 반대입니다. on_delete
레코드에서 가리키고있는 FK 항목이 삭제 된 경우 django에 수행 할 작업을 알려주기 위해 모델에 외래 키 (FK)를 착용 합니다. 옵션 저희 가게는 대부분이 사용하고 PROTECT
, CASCADE
하고 SET_NULL
. 내가 알아 낸 기본 규칙은 다음과 같습니다.
- 사용하다
PROTECT
하여 FK 정말 변경해서는 안하고가하는 룩업 테이블을 가리키는 경우 확실히 변화에 테이블을 야기해서는 안된다. 해당 룩업 테이블에서 항목을 삭제하려고 PROTECT
하면 레코드에 묶여 있으면 삭제되지 않습니다. 또한 방지 삭제에서 장고 당신 은 룩업 테이블에서 항목을 삭제해서 기록을. 이 마지막 부분이 중요합니다. 누군가가 성별 테이블에서 성별 "여성"을 삭제하려는 경우, 본인은 해당 성별을 가진 Person 테이블에있는 모든 사람을 즉시 삭제하기를 원하지 않습니다.
- 사용하다
CASCADE
FK가 "부모"레코드를 가리킬 때 . 사람이 많은 PersonEthnicity 항목을 가질 수 있습니다 경우에 따라서, (그 / 그녀는 아메리칸 인디언, 흑인과 백인이 될 수 있습니다), 그리고 사람이 있다고 한다 삭제, 난 정말 것이다 어떤 "아이"PersonEthnicity 항목을 삭제하고 싶습니다. 그것들은 사람 없이는 관련이 없습니다.
SET_NULL
당신이 할 때 사용 않는 사람들이 룩업 테이블에서 항목을 삭제하도록 허용 할,하지만 당신은 여전히 당신의 기록을 보존하고자합니다. 예를 들어, 한 사람이 HighSchool을 가질 수 있지만 해당 고등학교가 내 룩업 테이블에서 사라지면 실제로 중요하지 않습니다 on_delete=SET_NULL
. 이것은 내 개인 기록을 거기에 남겨 둘 것입니다. 내 Person의 고등학교 FK를 null로 설정했을뿐입니다. 분명히, 당신은 null=True
그 FK 를 허용해야합니다 .
다음은 세 가지를 모두 수행하는 모델의 예입니다.
class PurchPurchaseAccount(models.Model):
id = models.AutoField(primary_key=True)
purchase = models.ForeignKey(PurchPurchase, null=True, db_column='purchase', blank=True, on_delete=models.CASCADE) # If "parent" rec gone, delete "child" rec!!!
paid_from_acct = models.ForeignKey(PurchPaidFromAcct, null=True, db_column='paid_from_acct', blank=True, on_delete=models.PROTECT) # Disallow lookup deletion & do not delete this rec.
_updated = models.DateTimeField()
_updatedby = models.ForeignKey(Person, null=True, db_column='_updatedby', blank=True, related_name='acctupdated_by', on_delete=models.SET_NULL) # Person records shouldn't be deleted, but if they are, preserve this PurchPurchaseAccount entry, and just set this person to null.
def __unicode__(self):
return str(self.paid_from_acct.display)
class Meta:
db_table = u'purch_purchase_account'
마지막 골치 아픈 사람 이 아니라면 지정on_delete
(또는 지정 하지 않은 경우) 기본 동작은 CASCADE
? 이는 누군가 성별 테이블에서 성별 항목을 삭제 한 경우 해당 성별을 가진 모든 사람 레코드도 삭제되었음을 의미합니다.
나는 "의심 스럽다면 설정 on_delete=models.PROTECT
하십시오" 라고 말할 것입니다 . 그런 다음 응용 프로그램을 테스트하십시오. 데이터를 위험에 빠뜨리지 않고 어떤 FK에 다른 값을 표시해야하는지 신속하게 파악할 수 있습니다.
또한 on_delete=CASCADE
선택한 동작 인 경우 실제로는 마이그레이션에 추가되지 않습니다. 나는 이것이 기본값이기 때문에 추측합니다 on_delete=CASCADE
. 퍼팅은 아무것도 넣지 않는 것과 같습니다.