2014-08-27 1 views
0

LDAP 서버에 연결된 장고 응용 프로그램을 작성 중입니다. 여기에 내가하려고하는 트릭이있다.모델 저장 후 함수 호출

컴퓨터에 대한 정보가 들어있는 모델이 있습니다. 새 시스템을 추가하면 모델에서 AutoField와 같은 고유 한 UUID를 생성합니다. 요점은이 매개 변수가을 저장할 때 생성된다는 것입니다.
저장 한 후에는 해당 UUID를 유지하고 LDAP에서 새 개체를 만드는 기능이 필요합니다. 내가 신호에 대해 많이 알고하지 않았기 때문에
, 내가 이런 식으로 저장 기능 모델을 재정의하는 시도 :이 방법으로

def save(self): 

     # import needed modules 
     import ldap 
     import ldap.modlist as modlist 

     [--OPERATIONS ON THE LDAP--] 

     super(System, self).save() 

, 정상적으로 때문에 내가 기존 시스템 모든 작업을 수정하는 경우는 UUID가 이미 생성되었습니다. 하지만 만약 내가 새로운 시스템을 추가하려고하면 나는 UUID가 없음이라는 오류를 발견하고 LDAP의 빈 변수를 사용할 수 없다 (쓸모 없게 될 것인가?)

It 나는 시스템가 저장된 후에 LDAP에서 작동하는 함수를 으로 호출해야하며, 따라서 UUID가 생성 된 후에을 호출해야합니다. 내가 post_save 함수를 만드는 방법을 unserstand하려하지만 그것을 얻을 수 없습니다.
어떻게 할 수 있습니까?

감사

답변

0

독자가 말한 것처럼 신호가 필요하므로 코드를 더 깨끗하게 유지하고 부품 간의 로직을 분리 할 수 ​​있습니다.

일반적인 접근 방식은 당신의 모델 파일의 끝에서 신호를 배치하는 것입니다 : 우리가 do_something 기능과 post_save 신호를 연결 위의 예에서

# Signals 
from django.dispatch import receiver 

@receiver(models.signals.post_save, sender=YourModel) 
def do_something(sender, instance, created, **kwargs): 

    .... 

이는 장식 @receiver을 통해 수행됩니다, 데코레이터의 발신자가 모델 클래스를 가리 킵니다. 함수 내부에 인스턴스이 있으며 모델의 현재 인스턴스가 포함되고 플래그를 만들었습니다.이 플래그를 사용하여 새 레코드인지 아니면 이전 (모델이 업데이트되는 경우)인지를 확인할 수 있습니다.

+0

그래서 ** some.attribute **처럼 ** instance.attribute **를 사용하여 특정 속성을 호출 할 수 있다고 생각합니다. 그렇지 않으면이를 호출하는 다른 방법이 있습니까? –

+0

정확하게, 인스턴스는 모델 클래스 내에서 자체와 마찬가지로 모델 인스턴스입니다. :) – petkostas

0

신호는 다음과 같이 우수한 수 있지만 잘 작동 할 수 저장 방법의 정상에 선 super(System, self).save() 이동합니다. 이는 저장된 객체를 LDAP에 전달하기 전에 먼저 인스턴스를 저장한다는 의미입니다.

+0

너. 사실 나는 당신의 제안을 시도하고 그것이 작동한다고 말해야합니다! 하지만 나는 작업 영역을 나누기 위해 post_save 함수를 구현하는 것을 좋아한다. 또한 코드를 명확하게 유지해야한다. –