2013-08-08 1 views
4

내가 장고 문서를 참조하십시오django로 객체를 생성하기 위해 커스텀 매니저를 사용하는 목적은 무엇입니까?

Model Instance reference : Creating objects

당신은 __init__ 메소드를 오버라이드하여 모델을 사용자 정의 할 유혹 할 수있다. 그러나 그렇게하면 변경 사항이 모델 인스턴스가 저장되지 않을 수 있으므로 호출 서명을 변경하지 않도록주의하십시오.
오히려 __init__를 오버라이드 (override)보다, 이러한 방법 중 하나를 사용하십시오 :

  • 모델 클래스에 classmethod를 추가합니다.
  • 왜 두 번째 솔루션은 "일반적으로 선호"입니다

사용자 지정 관리자 (일반적으로 선호)의 메소드를 추가 하시겠습니까? I는 OneToOne 관계를 통해 모델 A 확장 모델 B 있고, I가 어떻게 그것이 "더 나은"에, 그리고 대응 A 객체를 생성하는 B 객체를 생성하는 방법을 만들려 상황에서

제안 된대로 사용자 정의 관리자를 사용하십시오. 아마도이 관리자를 기본 관리자가 제공하는 것 이외에 사용하지 않을 것입니다.

답변

4

코드에서 더 깨끗해 보이므로 좋다고 생각합니다. 또한 이점이나 차이가 그렇게 크지 않기 때문에 조금 강조해서 읽을 수도 있습니다. 즉, 스스로 구현할 때 제안 된 접근법을 사용합니다.

은 (순전히 설명을위한) 다음과 같은 모델을 고려 : 응용 프로그램에서

class Vehicle(models.Model): 
    wheels = models.IntegerField() 
    color = models.CharField(max_length=100) 

는 필요가 종종 어떤 차량의 종류 모든 차량, 또는 모든 오토바이, 또는를 얻기 위해 발생한다. DRY를 유지하려면이 데이터를 검색하는 표준 양식이 필요합니다. 특히, 제 생각에는

class CarManager(models.Manager): 
    def get_query_set(self): 
     return super(CarManager, self).get_query_set().filter(wheels=4) 

class Vehicle(models.Model): 
    #(...) 
    car_objects = CarManager() 

cars = Vehicle.car_objects.all() 
green_cars = Vehicle.car_objects.filter(color='green') 

, 후자는 청소기 같습니다 당신이 관리자를 만드는 경우

class Vehicle(models.Model): 
    #(...) 
    @classmethod 
    def cars(cls): 
     return Vehicle.objects.filter(wheels=4) 

cars = Vehicle.cars() 
green_cars = Vehicle.cars().filter(color='green') 

, 당신이 뭔가를 얻을 것이다 : 클래스 메소드를 사용하면은 다음 얻을 것 상황이 더욱 복잡해지면 모델 정의에서 혼란을 피하고, 기본값 인 objects 관리자를 사용하는 것과 비슷하게 유지합니다.

관련 문제