2009-06-28 3 views
6

나는 django 1.0.2 (및 django-helper)와 함께 google app 엔진을 사용하고 있으며 사람들이 재귀 적 삭제를 수행하는 방법에 대해 궁금해합니다. 내가 유형 '최고'의 개체를 삭제Google 애플 리케이션 엔진에서 재귀 삭제

이제
 
class Top(BaseModel): 
    pass 

class Bottom(BaseModel): 
    daddy = db.ReferenceProperty(Top) 

가, 나는 모든 관련 '바닥'객체도 함께 삭제하려면 :이 같은 뭔가 모델이 있다고 가정 .

이제는 'Top'개체를 삭제하면 'Bottom'개체가 유지되고 아무데도 속하지 않는 데이터가 나타납니다. 나는 물론 모든 개체를 찾아 삭제할 수

Caught an exception while rendering: ReferenceProperty failed to be resolved.

,하지만 내 실제 모델은 적어도 5 단계 수준이기 때문에, 나는 방법이 바라고 있어요 : 뷰에서 데이터 저장소에 액세스 할 때, 나는 끝낼 이 작업을 자동으로 수행 할 수 있는지 확인하십시오.

나는 자바와 함께 작동하는 방법에 대해이 article을 찾았으며, 이는 내가 원하는 것처럼 보인다.

누구나 내가 어떻게 장고에서 그 행동을 얻을 수 있었는지 알아?

답변

6

영향을받는 레코드를 검색하고 부모 레코드를 삭제하는 동시에이를 삭제하여 수동으로 구현해야합니다. 원할 경우 부모 클래스의 .delete() 메서드를 재정 의하여 모든 관련 레코드를 자동으로 삭제하여이 작업을 단순화 할 수 있습니다.

성능상의 이유로 키 전용 쿼리 (실제 엔터티를 가져오고 디코딩하지 않고 삭제할 엔터티의 키를 가져올 수 있음) 및 일괄 삭제를 사용하려는 경우가 거의 확실합니다. 예 :

db.delete(Bottom.all(keys_only=True).filter("daddy =", top).fetch(1000)) 
+0

db.delete는 각 엔터티에서 delete()를 호출합니까? 그것은 악의적으로 최적화 되었기 때문에이 두 가지 트릭을 결합 할 수 없다는 점에 조금 의심 스럽습니다. 키스 좋은 점. –

+0

아니요, db.delete()는 병렬로 삭제할 모든 키를 보내는 단일 RPC에 직접 해당합니다. Entity.delete()는 db.delete (self)를 호출하는 단순한 문법적 설탕입니다. –

+1

'db.delete (top.bottom_set)'가 정상적으로 작동하지 않겠는가? –

2

실제로 그 행동은 GAE에 따라 다릅니다. Django의 ORM은 .delete()에서 "ON DELETE CASCADE"를 시뮬레이트합니다.

본인의 질문에 대한 답변이 아니지만 잘못된 곳을 찾는 데 도움이 될 수 있습니다. 계층 구조가 깊은 수준의 소수 인 경우

1

, 당신은 파일 경로처럼 보이는 필드와 함께 뭔가를 할 수있을 것 : 물건의

daddy.ancestry = "greatgranddaddy/granddaddy/daddy/" 
me.ancestry = daddy.ancestry + me.uniquename + "/" 

종류. 적어도 형제 사이에는 고유 한 이름이 필요합니다.

개체 ID 정렬 경로는 이미이를 처리하지만 엔티티 그룹과 연결된 IIRC는 데이터 도메인에서 관계를 표현하는 데 사용하지 않는 것이 좋습니다.

그럼 당신은 다음과 같이 초기 문자열의 트릭을 사용하여 할아버지의 자손 모두를 반환하는 쿼리를 만들 수 있습니다

query = Person.all() 
query.filter("ancestry >", gdaddy.ancestry + "\U0001") 
query.filter("ancestry <", gdaddy.ancestry + "\UFFFF") 

을 당신이 500 바이트 StringProperty에 조상을 맞지 않을 수 있다면 분명히이 아무 소용이 없다 .

2

데이터 구조를 재검토하십시오. 그리고 조상에 대한 질의

class Top(db.Model): pass 
class Middle(db.Model): pass 
class Bottom(db.Model): pass 

top = Top() 
middles = [Middle(parent=top) for i in range(0,10)] 
bottoms = [Bottom(parent=middle) for i in range(0,10) for middle in middles] 

= 상단이 모든 수준에서 모든 레코드를 찾을 수 : 관계 레코드 수명에 변경하지 않을 경우, 당신은 "조상"GAE의 기능을 사용할 수 있습니다.따라서 삭제하기가 쉽습니다.

descendants = list(db.Query().ancestor(top)) 
# should return [top] + middles + bottoms 
+0

아름다운. 목록 이해력의 좋은 사용. 처음으로 두 개의 루프가있는 것을 보았습니다! 그것들은 외부 순서가 먼저 오면 그들은 다른 순서로있을 것 같습니다. –

관련 문제