2010-07-30 6 views
0

나는 다음과 같은 모델을 가지고 :장고 관계의 객체를 삭제하려면 어떻게해야합니까? (관련된 모든 객체를 유지하면서)?

One 
    name (Char) 

Many 
    one (ForeignKey,blank=True,null=True) 
    title (Char) 

나는 인스턴스를 삭제하려면 모든 관련 개체가 인스턴스에 대한 자신의 관계를 느슨하게한다. 현재 코드는 다음과 같습니다.

one=One.objects.get(<some criterion>) 

more=Many.objects.filter(one=one) 
for m in more 
    m.one=None 
    m.save() 
#and finally: 
one.delete() 

코드는 무엇을 수행합니까? 삭제해야하는 개체를 찾고 관련 개체를 검색하고 ForeignKey를 None으로 설정 한 다음 인스턴스 하나를 삭제합니다. 그러나이 프로세스의 어딘가에서 모든 관련 개체 (많은 인스턴스)를 프로세스에서 삭제할 수도 있습니다. 내 질문은 : 관련 개체가 삭제 된 이유는 무엇이며 어떻게 방지합니까?

답변

1

코드는 정확합니다. 질문을 할 때 제 문제는 제 구현에서 오타였습니다. 날

수치

음 ...에 개선 될 수있는 비트가 여전히 존재 :

more=Many.objects.filter(one=one) 
for m in more 
    m.one=None 
    m.save() 
#and finally: 
one.delete() 

은 다음과 같이 쓸 수있다 :에 해당

for m in one.many_set.all() 
    m.one=None 
    m.save() 
one.delete() 

:

one.many_set.clear() 
one.delete() 
1

당신은 처음부터 무리 업데이트를 사용할 수 있습니다

Many.objects.filter(one=one).update(one=None) 

나는 장고 (DBMS에서 삭제 캐스케이드에없이) 프로그램 수준에서 관련 객체를 삭제 있다고 생각합니다. 그래서 아마도 당신의 객체는 일종의 캐시에 있고 Django는 여전히 그들이 one 객체와 관련이 있다고 생각합니다.

삭제하기 전에 관련 개체를 나열하십시오.

print one.many_set 
one.delete() 

여전히이 세트의 물건이 있다면 당신은 아마 다시 DB에서 one를 가져해야하고 삭제합니다. 또는 무리 삭제를 사용할 수 있습니다.

One.objects.filter(<cryteria>).delete() 
관련 문제