2017-02-16 7 views
0

인스턴스가 공통 모델 인스턴스를 서브 클래스로 공유하는 Django 1.6 모델 구조가 있습니다. 데이터베이스 관점에서모델 상속에서의 상태 공유 및 삭제

inheritance

B위한 A 행에 대한 행과 parent_link ID의 사용에 대한 행 C있다.

AC에 대한 C'.delete() 행을 호출

이 삭제되지만 B에 대한 고아 기록이있다. A을 직접 인스턴스화하고 delete를 호출하면 BC 인스턴스가 삭제됩니다. 가장 간단한 방법으로 B 또는 C 인스턴스를 삭제하면 부모와 형제 상태가 모두 삭제됩니다.

A의 인스턴스를 삭제하면 B와 C의 링크 된 인스턴스가 삭제됩니다. B를 삭제하면 B와 A가 삭제됩니다. C를 삭제하면 C와 A가 삭제됩니다.

A, B 또는 C 인스턴스를 삭제하면 delete() 인스턴스가 호출되는 것과 관계없이 다른 모든 인스턴스가 삭제 될 수 있습니다. 어떻게해야합니까? 지속 및 다른 기본 인스턴스가 될 때까지 쿼리에 나타나지 않습니다 보조 노트로

는 모든 인스턴스가 삭제 한 것으로 나타났습니다, 그래서 C'에서 .delete()를 호출 할 때이 기본 상태와 B'가 삭제되어 나타나지만 B'에 대한 행을 가리키고 PK이 정렬 된 위치에 생성됩니다. 이 경우 B'가 다시 출연합니다.

다음은 클래스입니다 :

class A(models.Model): 
    # Fields here 

class B(A): 
    a_ptr = models.OneToOneField(A, parent_link=True) 
    # More fields 

class C(A): 
    a_ptr = models.OneToOneField(A, parent_link=True) 
    # More fields 

# Code 
shared_state = A() 
shared_state.save() 
sharer_b = B(a_ptr=shared_state.id) 
charer_c = C(a_ptr=shared_state.id) 
sharer_b.save() 
sharer_c.save() 

# Objective, this should delete all rows for the above? 
sharer_c.delete() 

답변

0

당신은 당신의 models delete() method 또는 post_delete signal를 사용 오버라이드 (override) 할 수 있습니다. 참고 : 링크는 현재 릴리스 문서에 있지만 1.6은 1.6에서 동일하게 작동합니다.

+0

2 인스턴스가 공통 인스턴스 (A와 B 인스턴스를 공유)를 공유하는 1.6의 문제는 C 삭제를 삭제하는 것이지만 B 행은 여전히 ​​존재하지만 액세스가 불가능한 고아입니다. –