2008-10-04 6 views
61

내 머리를 감싸는 데 문제가 있습니다. 지금은 같은 종류의 보이는 일부 모델이 있습니다Django 신호 대 무시 메서드 무시

def Review(models.Model) 
    ...fields... 
    overall_score = models.FloatField(blank=True) 

def Score(models.Model) 
    review = models.ForeignKey(Review) 
    question = models.TextField() 
    grade = models.IntegerField() 

검토는 overall_score는 점수의 평균 몇 가지 "점수"가있다. 리뷰 또는 점수가 저장되면 overall_score 평균을 다시 계산해야합니다. 지금은 재정의 된 save 메소드를 사용하고 있습니다. Django의 시그널 디스패처를 사용하면 어떤 이점도 있습니까?

답변

67

신호 저장/삭제는 일반적으로 문제의 모델과 완전히 다른 것이 아닌 변경 사항을 적용해야하는 상황에서 일반적으로 유리하거나 또는 공통된 항목이있는 모델에 적용 할 수 있습니다. 모델.

오버라이드 된 save의 일반적인 작업 중 하나는 모델의 일부 텍스트 필드에서 슬러그를 자동 생성하는 것입니다. 이것은 많은 모델에 대해 구현해야하는 경우 pre_save 신호를 사용하면 도움이되는 신호의 예입니다. 여기서 신호 처리기는 슬러그 필드의 이름과 슬러그를 생성하는 필드의 이름을 사용할 수 있습니다 . 이와 같은 기능을 갖추면 모든 기능을 모든 기능에 적용 할 수 있습니다. 고유성을 보장하기 위해 문제의 모델 유형에 대해 추가하려는 슬러그를 올려보십시오.

재사용 가능한 응용 프로그램은 종종 신호를 사용하면 이익을 얻습니다. 제공하는 기능을 모든 모델에 적용 할 수 있다면 일반적으로 (피할 수없는 경우를 제외하고) 사용자가 모델을 직접 수정하여 그것.

django-mptt, 예를 들어, I는 객체 것에 대한 트리 구조 정보를 제거하기 위해 생성되거나 업데이트되기 직전 모델의 트리 구조를 설명 필드 세트와 pre_delete 신호를 관리하는 pre_save 신호를 사용 삭제 된 개체의 전체 하위 트리와 개체가 삭제됩니다. 신호를 사용하기 때문에 사용자는 save 또는 delete 메소드를 모델에 추가하거나 수정할 필요가 없으므로 django-mptt가 관리하고자하는 모델을 알리면됩니다.

3

신호를 사용하면 관련 점수 모델을 저장할 때마다 점수를 업데이트 할 수 있습니다. 하지만 이러한 기능을 필요로하지 않는다면 신호를 넣을 이유가 없다는 것을 알 수 있습니다.이 모델은 꽤 관련이 있습니다.

2

일종의 비정규 화입니다. 이 pretty solution을보세요. 현재 위치 구성 필드 정의.

-20

신호는 장기적인 프로세스를 실행해야하고 저장을 기다리는 사용자를 차단하고 싶지 않을 때 유용합니다.

+8

아니, 신호를 차단합니다. – muhuk

+8

@muhuk이 맞습니다. 신호가 프로세스를 차단합니다. 차단 된 프로세스를 피하려면 gevent, celery 또는 기타 비동기 도구와 같은 도구를 사용하십시오. – pydanny

+1

나는 muhuk와 pydanny의 점 때문에 -1을 준다. 완전히 잘못된 조언 인 것 같습니다. 신호 처리가 완료 될 때까지 요청이 완료되지 않습니다. 그래서 샐러리는 내가 보통 장고 프로젝트에서 사용하는 좋은 해결책 인 것 같다. –

11

당신은 질문 :

장고의 신호 디스패처를 사용하여 어떤 이점이 있을까?

내가 장고 문서에서 이걸 발견 :

오버라이드 (override) 모델 방법은 객체의 삭제() 메소드가 반드시 삭제 객체를 호출되지

참고 대량 작업에 호출되지 QuerySet을 사용하여 대량으로 또는 계단식 삭제 의 결과로 생성됩니다.사용자 정의 삭제 논리가 실행되도록하려면 은 pre_delete 및/또는 post_delete 신호를 사용할 수 있습니다.

불행히도 개체를 대량으로 생성하거나 업데이트하는 경우에는 save(), pre_save 및 post_save 중 어느 것도 호출되지 않으므로 해결 방법이 없습니다. 이 호출됩니다. 에서

: 당신이 명시 적으로 스레드를 생성하지 않는 Overriding predefined model methods

+2

Django 관리자 목록보기에서 대량 삭제를 사용합니다 ...이 맛있는 음식을 접할 때까지 혼란 스러웠습니다. –

+0

또한 "불행하게도 save(), pre_save 및 post_save가 호출되지 않으므로 대량으로 객체를 만들거나 업데이트 할 때 해결 방법이 없습니다." - 그래서 나는 이것이이 방법들 사이의 절충이라고 생각하지 않는다. – Cory