2014-02-17 4 views
5

나는 신호를 미리 저장하고 post_save하여 분석을 Mixpanel에 보낸다. 나는 이것을 내 모델의 save 메소드와 분리하는 것을 선호한다.장고 : pre_save 신호에서 변수를 전달하기

pre_save 신호가 발생할 때 인스턴스의 이전 값을 저장 한 다음 post_save에서 새 값을 확인하는 방법이 있습니까? 나를 위해

@receiver(pre_save, sender=Activity) 
def send_user_profile_analytics(sender, **kwargs): 
    activity_completed_old_value = kwargs['instance'].is_completed 
    # store this value somewhere? 

@receiver(post_save, sender=Activity) 
def send_user_profile_analytics(sender, **kwargs): 
    if kwargs['instance'].is_completed != activity_completed_old_value: 
     # send analytics 

pre_save보다 분석을 보낼 post_save를 사용하여보다 강력한 보이지만, 그 시점에서 나는 모델 인스턴스에서 변경된 내용을 볼 수 없습니다 :

내 코드는 다음과 같습니다. 내 모델의 저장 기능에서 전역을 사용하거나 무언가를 구현하는 것을 막고 싶습니다.

답변

5

인스턴스 속성으로 저장할 수 있습니다. 당신이 (즉, save 그냥 값을 저장하지 않는다는 것을 의미하지만, 몇 가지 더 정교하게) save 동안 경우에만 is_completed 변경 "분석을 보내"이런 식으로

@receiver(pre_save, sender=Activity) 
def send_user_profile_analytics(sender, **kwargs): 
    instance = kwargs['instance'] 
    instance._activity_completed_old_value = instance.is_completed 

@receiver(post_save, sender=Activity) 
def send_user_profile_analytics(sender, **kwargs): 
    instance = kwargs['instance']  
    if instance.is_completed != instance._activity_completed_old_value: 
     # send analytics 

.

당신은 필드 (즉, save까지 그것의 창조에서이다)는 post_init (그리고 pre_save)시의 초기 값을 저장해야 인스턴스 수명 기간 동안 변경 작업을 수행합니다.

+0

나는 이미 그것을 생각하고 있었지만 Django에 대한 좋은 연습은 무엇입니까? 왜 내가 그것을 보호 속성으로 만들겠습니까? post_init 힌트를 보내 주셔서 감사합니다. – jvannistelrooy

+0

@jvannistelrooy : 보호 된 속성은 필요 없지만 이러한 기능 외에는 이러한 추가 속성을 사용하지 않는 것이 좋습니다. 서비스 필드 일 뿐이 기 때문입니다. 나는이 솔루션을 어딘가에서 발견했다 ... 내가 찾은 링크를 게시하자마자 – Don

+1

'post_init'이'pre_save'보다 나은 이유를 설명해 주시겠습니까? 값이 실제로 필요하지 않은 경우에도 추가 db 쿼리를 추가하지 않을까요? –

관련 문제