문제

나는 이것에 머리를 감싸는 데 어려움을 겪고있다. 지금 당장 나는 다음과 같은 것처럼 보이는 몇 가지 모델이 있습니다.

 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()

리뷰에는 몇 가지 "점수"가 있으며 전체_SCORE는 점수의 평균입니다. 리뷰 나 점수가 저장되면 전체 _score 평균을 다시 계산해야합니다. 지금은 재정의 저장 메소드를 사용하고 있습니다. Django의 신호 디스패처 사용에 이점이 있습니까?

도움이 되었습니까?

해결책

저장/삭제 신호는 일반적으로 문제의 모델에 전적으로 특정하지 않거나 공통된 무언가가 있거나 모델에서 사용하도록 구성 할 수있는 모델에 적용될 수있는 변경을 해야하는 상황에서 일반적으로 유리합니다.

재정의 한 가지 일반적인 작업 save 메소드는 모델의 일부 텍스트 필드에서 자동화 된 슬러그 생성입니다. 그것은 여러 모델을 위해 그것을 구현해야한다면 pre_save 신호 핸들러가 슬러그 필드의 이름과 필드 이름을 가져와 슬러그를 생성 할 수있는 신호. 일단 당신이 이와 같은 것을 가지고 있으면, 당신이 배치하는 향상된 기능은 모든 모델에도 적용됩니다. 예를 들어, 고유성을 보장하기 위해 문제의 모델 유형을 추가하려는 슬러그를 찾으십시오.

재사용 가능한 응용 프로그램은 종종 신호 사용의 혜택을받는 경우가 종종 있습니다. 제공하는 기능이 모든 모델에 적용될 수 있다면 일반적으로 (피할 수없는 경우가 아니라면) 사용자가 모델을 혜택을 받기 위해 모델을 직접 수정하지 않아도됩니다.

와 함께 django-mptt, 예를 들어, 나는 그것을 사용했다 pre_save 생성되거나 업데이트 될 모델의 트리 구조를 설명하는 필드 세트를 관리하는 신호 및 pre_delete 트리 구조를 제거하는 신호 삭제중인 객체와 객체의 전체 하위 트리에 대한 세부 사항이 삭제되고 삭제됩니다. 신호 사용으로 인해 사용자는 추가하거나 수정할 필요가 없습니다. save 또는 delete 모델에 대한 방법은이 관리를 수행하기위한 방법으로 Django-MPTT에 관리가 원하는 모델을 알려야합니다.

다른 팁

당신은 물었다 :

Django의 신호 디스패처 사용에 이점이 있습니까?

Django 문서에서 이것을 찾았습니다.

대량 작업에서 재정의 모델 방법은 호출되지 않습니다

쿼리 세트를 사용하여 대량으로 객체를 삭제하거나 계단식 삭제의 결과로 객체의 delete () 메소드가 반드시 호출 될 필요는 없습니다. 맞춤형 삭제 로직이 실행되도록하려면 pre_delete 및/또는 post_delete 신호를 사용할 수 있습니다.

불행히도 Save (), pre_save 및 post_save가 호출되지 않으므로 대량으로 개체를 만들거나 업데이트 할 때 해결 방법이 없습니다.

에서: 사전 정의 된 모델 방법을 우선적으로 수행합니다

신호를 사용하면 관련 점수 모델이 저장 될 때마다 검토 점수를 업데이트 할 수 있습니다. 그러나 그러한 기능이 필요하지 않으면 이것을 신호에 넣을 이유가 없습니다. 그것은 모델 관련 사항입니다.

그것은 일종의 비정규 화입니다. 이거 봐요 예쁜 해결책. 내부 구성 필드 정의.

벌크 삭제에 대한 Django 문서의 작은 추가 (.delete() 메소드 켜짐 QuerySet 사물):

가능할 때마다 순전히 SQL로 실행되므로 개별 개체 인스턴스의 삭제 방법이 프로세스 중에 반드시 호출되지는 않습니다. 모델 클래스에 사용자 정의 delete () 메소드를 제공하고 호출되도록하려면 해당 모델의 인스턴스를 "수동으로"삭제하고 쿼리 세트를 반복하여 삭제 ()을 호출하여 삭제해야합니다. 쿼리 세트의 Bulk Delete () 메소드를 사용하지 않고 각 객체) 개별적으로).

https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

및 대량 업데이트 (.update() 메소드 켜짐 QuerySet 사물):

마지막으로, update ()가 SQL 레벨에서 업데이트를 수행하므로 모델에서 save () 메소드를 호출하지 않으며 pre_save 또는 post_save 신호 (calling model.save의 결과입니다. )). Custom Save () 메서드가있는 모델에 대한 레코드를 업데이트하려면 루프를 고정하고 Save ()를 호출하십시오.

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update

신호는 장기적인 프로세스를 실행해야 할 때 유용하며 사용자가 저장을 기다릴 때까지 차단하지 않으려 고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top