2012-08-15 2 views
0

django-denorm을 사용하여 다중 레벨 관계를 비정규화할 수 있습니까?django-denorm에서 다른 모델을 통한 관계 비정규 화

Question --> User --> CustomProfile --> Avatar 

내가 Question 모델에 아바타 이름을 비정규 화하려는 :

특히, 나는 다음과 같은 구조를 가지고있다. 현재이 4 개의 테이블을 탐색해야 해당 정보를 얻을 수 있습니다.

저는 Postgresql을 사용하고 있습니다.

답변

2

일반적으로 체인 종속성이 작동하며이 상황을 처리하는 방법입니다.

체인의 하나 개의 모델이 당신을 제공하지 않습니다이 경우

, 당신의 최선의 선택은에서 발견 된 것과 유사한 자신의 종속 클래스를 구현하는 것입니다 : https://github.com/initcrash/django-denorm/blob/master/denorm/dependencies.py

을 그래서 당신은 얻을 :

class Question(models.Model): 
    @denormalized(...) 
    @depend_on_related("User") 
    @depend_on_indirectly_related("CustomProfile",through="User") 
    def avatar(self): 
     return self.user.custom_profile.avatar_name 

class CustomProfile(models.Model): 
    @denormalized(...) 
    @depend_on_related("Avatar") 
    def avatar_name(self): 
     return self.avatar.name 

이것은 물론 django-denorm의 환영 패치가 될 것입니다.

+0

제안에 감사드립니다. 나는 그것을 구현하려고 노력할 것이며, 다시 기여할 것이다. 그 동안, 나는 내 자신의 필드를 추가하고 해당 모델의'save' 메소드를 오버라이드했다. – ustun

1

이 시도하지 않은하지만 당신이 시도 줄 수 :

캐스케이드는, 그것은해야 내부적으로 트리거를 사용하기 때문에 당신의 모델이 Avatar --> Custom Profile --> User --> Question

을 즉 걸쳐 코드official doc에서 관련 모델에 따라 을 종속.

class SomeModel(models.Model): 
    # the other fields 
    other = models.ForeignKey('SomeOtherModel') 

    @denormalized(models.CharField,max_length=100) 
    @depend_on_related('SomeOtherModel') 
    def some_computation(self): 
     # your code 
     return some_value 

이 개인적으로 다음 장고의 ORM에 따라 사용자 지정 SQL을 사용할 수 있습니다 작동하지 않는 경우.

+0

죄송합니다. 귀하의 제안을 이해할 수 없습니다. 당신이 제안하는 것은 경로의 각 모델에 비정규 화를 넣는 것입니다, 그것이 당신이 제안하고있는 것입니까? 그래서 다음 단계로 넘어갑니다. 나는 그 생각을 가지고 있지만 문제는 내가 장고 - auth의 사용자 모델을 사이에, 내가 만지고 싶지 않아있다. – ustun

+0

글쎄, 장고 인증 사용자 모델을 확장하고'Question' 모델에 의해 참조 된 것으로'CustomProfile (auth.User) '을 만들 수 있습니다. –

관련 문제