2012-05-30 2 views
3

Invoice라는 모델의 delete 메소드를 재정의하려고합니다. 모델 송장은 모델 액션에서 ForeignKey에 의해 참조됩니다. https://stackoverflow.com/a/1539182delete_selected()를 재정 의하여 자식 모델의 필드를 업데이트하십시오.

나를 위해 작동하지 않습니다 : 대답

How do I override delete() on a model and have it still work with related deletes

: 나는 송장이

이 게시물에 설명 된 솔루션

을 삭제 때 모델 관리자에 청구라는 BooleanField를 업데이트 할 다음과 같이 models.py :

def delete(self): 
     Action.objects.filter(invoice=self).update(billed=False) # and tried 0 instead of False 
     super(Invoice,self).delete() 

도 시도 :

def delete(self): 
    actions = Action.objects.filter(invoice=self) 
    for action in actions: 
     action.billed=False # and tried 0 instead of False 
     action.save() 
    super(Invoice,self).delete() 

모델 조치의 ForeignKey 필드에는 송장이 삭제 될 때 작업 삭제를 피하기 위해 on_delete = models.SET_NULL이 있습니다. 그러나 나는 또한 False로 청구서를 다시 설정해야합니다.

invoice = models.ForeignKey(Invoice, verbose_name = 'Rechnung', null=True, blank=True,on_delete=models.SET_NULL) 

난 그냥 여기 관리자의 작업을 선택 삭제하는 것이 https://code.djangoproject.com/ticket/10751을 읽을 수는

내가 delete_view()를 사용할 필요가

대신

그래서 내가

def delete_selected(self, request, obj, extra_context=None): 
    Action.objects.filter(invoice=self).update(billed=False) 
    super(InvoiceAdmin, self).delete_view(request, obj, extra_context) 
시도) (삭제와 overridde 수 없습니다

자기 대신 obj를 사용하려고했지만 해결책이 아닙니다.

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? 작업 객체가 업데이트되지 않거나 삭제되지 않은 송장 객체입니까? 또는 둘 다입니까? 오류가 발생 했습니까? – scoopseven

+0

송장이 업데이트 (삭제)되었지만 작업에 아무런 변화가 없습니다. delete() 또는 delete_selected() 액션은 오버라이드되지 않았습니다. 이제는 get_actions 및 del deleted_selected와 함께 작동하고 사용자 정의 작업 delete_model을 모델에 전달합니다. – surfi

답변

6

코드에서 어느 곳 하나 obj을 삭제하면 this answer 작품,의 delete_model 방법을 던질 것이다 동안 오류.

actions = ['delete_selected'] 

def delete_selected(self, request, obj): 
    for o in obj.all(): 
     Action.objects.filter(invoice=o).update(billed=False) 
     o.delete() 

delete_selected.short_description = 'Ausgewählte Rechnungen löschen' 

그냥 변경 목록 관리 페이지의 delete_selected 조치를 오버라이드 (override) :

나는이 좋습니다. 이렇게하면 작업을 완전히 삭제할 필요가 없으며 delete_model 메서드를 무시하고 더하기로 변경 <object> 관리 페이지에서 개별 항목을 계속 삭제할 수 있습니다. 장기적으로는 코드가 적습니다. :)

7

제가 해결책을 찾았으므로 Stephane https://stackoverflow.com/a/4534773/326905으로 제 문제를 해결했습니다.

올바른 조치는 아래에 admin.py에서 을 delete_selected입니다 InvoiceAdmin 모델

actions = ['delete_model'] 

def get_actions(self, request): 
    actions = super(InvoiceAdmin, self).get_actions(request) 
    del actions['delete_selected'] 
    return actions 

def delete_model(self, request, obj): 
    for o in obj.all(): 
     Action.objects.filter(invoice=o).update(billed=False) 
     o.delete() 

delete_model.short_description = 'Ausgewählte Rechnungen löschen' 
+1

편집 화면에서이 모델을 삭제할 때 오류가 발생합니다. –

관련 문제