2011-07-03 2 views
1

저는 다음과 같이 Content 모델로부터 상속받은 Photo 클래스를 가지고 있습니다 :장고 : 자식의 저장 실패 할 때 고아 부모 인스턴스

class Content(models.Model): 
    added = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 

class Photo(Content): 
    file = models.ImageField(upload_to='photos/') 

    def __unicode__(self): 
     return self.caption and self.caption or '' 

볼 수 있듯이 내용 자체는 추상적이지 않습니다. ModelForm에 의해 사진을 업로드합니다. 그러나 어떤 이유로 사진 저장에 실패하면 고아 컨텐츠 인스턴스가 남아 있습니다. Photo 인스턴스가 저장되기 전에 부모 모델의 인스턴스가 만들어졌지만 사진이 실패하면 부모가 정리되지 않은 것 같습니다.

이것은 장고 쪽 버그인가요? 어떻게 예방할 수 있습니까?

+1

'Content'는 추상이 아니기 때문에 자신의 테이블을 얻습니다. 'Photo'는 숨겨진'OneToOneField'가 연결된'Content'를 가리키는 별도의 테이블입니다. 따라서'Content' 엔트리는'Photo' 엔트리를 만들기 위해'id' 필드가 필요하기 때문에 먼저 생성되어야합니다. 'Photo'를 생성 할 수 없다면'Content'가 롤백되기를 원할 것이므로, 트랜잭션을 정의하십시오 (아래 참조). –

+0

감사합니다. 하지만 이것은 데이터베이스 추상화가 외래 키와 같은 다른 경우에 일관성 검사를 제공하는 방식과 비슷하게 장고가 처리해야 할 것으로 생각합니다. – omat

+0

Django는 IIRC의 ForeignKey 일관성 검사를 제공하지 않습니다. 데이터베이스가 그렇게합니다. SQLite를 사용할 때마다 장고가 생성 한 FK 제약 조건이 무시 될 때마다 많은 경고를받습니다. 트랜잭션의 경우 Django가 적절한 사용을 유추 할 수있는 적절한 기회를 가지기에는 너무 복잡하기 때문에 개발자에게 알려야합니다. 대답에 대해 –

답변

3

항상 동일합니다. transactions을 사용하십시오.

+0

감사합니다. 나는 입안에 신맛이 나는 거래를 사용할 것이다. db의 일관성이 데이터베이스 레이어에 의해 처리되는 다른 경우처럼 장고가 이미 처리해야하는 것처럼 느껴집니다. – omat

+1

트랜잭션 *는 데이터베이스 계층에 있습니다. –

+0

내가 의미하는 바는 예를 들어, fk 관련 아이를 명시 적으로 제거 할 필요가 없다는 것입니다. django orm은 이것을 처리하고 일관성을 유지합니다. – omat

관련 문제