이유

2014-06-10 2 views
1

간결한 질문 : 외부 테이블에 장고에서 many-to-many 관계 (1.5) 모델링의 장점과 단점이를 사용하지 않고 무엇
~ 매개 변수?이유

세부 사항 :
말, 나는 사용자 정의 사용자 모델 USERPROFILE을 가지고 있고 나는 다음 관계를 구현하기 위해, 예를 들어, 같은 모델에 M2M 관계를 정의 할 수 있습니다. 아래 켰을 때, 나는 USERPROFILE 모델에 M2M 필드를 추가한다이 경우

class Relationship(models.Model): 
    """Relationship model""" 
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='from_users') 
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='to_users') 
    created = models.DateTimeField(auto_now_add=True) 
    is_blocked = models.BooleanField(default=False) 
    objects = RelationshipManager() 

: 저는 외부 테이블 (모델) like so를 정의 할 수 있습니다? 그렇다면 왜? 사용자 간의 모든 관계를 처리 할 수있는 것은 관계 모델이 맞습니까?

class UserProfile(AbstractBaseUser, PermissionsMixin): 
    user_following = models.ManyToManyField('self', through=Relationship, symmetrical=False, related_name='followed') 

답변

1

우선, 그것은 데이터베이스의 개념 데이터 모델 (CDM) 및 물리적 데이터 모델 (PDM)의 차이를 확인하는 것이 중요합니다. 다른 사용자 프로필에 사용자 프로필을 연결할 경우

은 개념적으로, 당신이 두 기관이 필요하다고 보인다.

기술적으로 (물리적으로) Many To Many 관계를 만들기 때문에 시스템은 절대적으로 두 개의 UserProfiles 사이의 관계를 저장하는 세 번째 데이터베이스를 만들어야합니다. 그렇지 않으면 불가능합니다. 그것은 OneToOne 또는 OneToMany 관계라면, 기술적으로, 2 개 테이블 (이 키워드는 ManyToMany 관계와 존재 이유를 설명하는) 충분한 될 것이라고

참고.

지금, 장고, 여러분의 인생을 더 쉽게 만드는 시도 이해 : 당신이 "실제"레이어 걱정하지 않는 것이 가능하다. 예를 들어 어떤 사용자가 다른 사용자와 연결되어 있는지 알기 원하면 추가 정보없이

->이 경우, 당신은 단지 전체 물건의 작품을 만들 수있는 기술적 인 제약 제 3 테이블에 대해 상관 없어! through 키워드는 사용할 필요가 없습니다. 이 경우 Django에서는 2 개의 모델 만 표시되지만 Django에서는 데이터베이스가 보이지 않더라도 데이터베이스에 3 개의 테이블이 있습니다.

그러나 (종종 실제로) 어떤 경우

, 당신은 사용자 사이의 관계에 대한 중요한 정보를 추가하려면이 세 번째 테이블을 사용할 수 있습니다. 예를 들어 릴레이션이 생성 된 날짜를 저장하려면이 세 번째 테이블이 완벽한 장소입니다.

->이 "기술"테이블은 "기능"테이블이됩니다 : 당신은 지금 당신이 사용자 사이의 관계뿐만 아니라 필요한 데이터가 포함되어 있기 때문에 프로젝트에 직접 사용하고자! through 키워드를 사용하여 Django Project에서이 세 번째 테이블을 정의하고이 모델/테이블에 속성 (예 : assocation_date)을 추가합니다. 이제 Django에는 3 가지 모델이 있고 데이터베이스에 추가 된 추가 속성이있는 3 개의 테이블이 있습니다.

클라이언트가 1> N 제품을 주문할 수 있습니다

또 다른 고전적인 예.제품은 0 -> N 고객별로 주문할 수 있습니다. 이것은 분명히 ManyToMany Relashionship입니다.

주문에 대한 정보 (총 가격, 날짜 등)를 저장하려는 경우 클라이언트와 제품 간의 M2M 관계를 정의 할 때 through="Order"을 설정할 수 있습니다. 그러면 Django에서 Order 모델을 정의하고 빙고! 야곱 카플란 - 모스에 의해 기술 "을 통해"사용

+0

그래, 난이 알고 확인, 질문은 : 어떻게 내가 그것을 연결하지 않고 이미 M2M (관계)를 정의하는 외부 테이블을 사용하는 경우 m2m 필드와 "through"매개 변수? 장점 단점? – Leonardo

+0

나는 그렇게해서는 안된다고 생각합니다. 당신이 relashiohship을 위해 만들어진 테이블을 정의한다면, 장고에 그것을 사용하도록 알려줘야한다. 그렇지 않다면, 장고는 관계를 만들기 위해 장고를 사용해야한다는 것을 어떻게 알았습니까? 귀하의 질문에 대답하기 위해, 나는 아무런 이점도 보지 못했지만 (아마 있을지 모르지만 ^^), 단점 만 : M2M을 위해 만들어진 모든 장고 메커니즘은 자동으로 작동하지 않습니다. –