2011-01-23 6 views
3

Django 기반 프로젝트에서 작업하는 동안 저는 항상 재간 형 응용 프로그램에 대한 장고의 접근 방식을 따르려고합니다. 서로 응용 프로그램을 분리하고 특히 상호 참조를 피하려고 할 때가 있지만 때때로 그것은 가능하지 않습니다.Django 응용 프로그램의 순환 종속성 방지

기사와 사용자라는 두 가지 응용 프로그램이있는 간단한 예를 생각해 봅시다. 기사 응용 프로그램은 기사 모델, 기사 목록보기 및 단일 기사보기를 정의하고, 사용자 응용 프로그램은 사용자 모델 및 사용자 프로필보기를 정의합니다. 기사는 저자 필드에서 사용자를 참조하므로 기사 응용 프로그램은 분명히 사용자 응용 프로그램에 종속적입니다.

하지만 사용자 프로필에 관해서는 해당 페이지에서 사용자가 작성한 최신 기사를 표시하고 싶지만 (사용자가 본 최신 기사 일 수도 있음) 사용자 응용 프로그램이 사용자가 응용 프로그램을 인식하게합니다. 피하려고.

분명히 이러한 모든 참조를 템플릿 수준으로 밀어 넣을 수는 있지만 여전히 문제를 완전히 해결하지 못하고 동시에 데이터베이스 쿼리 측면에서 매우 비효율적 일 수 있습니다.

그런 경우에는 무엇을합니까?

답변

9

'사용자'앱과 '기사'앱 사이에 대화가 실제로 설정되지 않은 경우 인터페이스로 작동하는 세 번째 앱이 필요합니다. 그러면 사용자와 기사에 대해 알게되고 사용자와 기사 사이의 모든 연결을 정의하게됩니다. 사용자 데이터를 가져와 사용자 프로필보기가있을 것이므로 "Fred는 5 개의 기사를 썼습니다"라고 말할 필요가 있기 때문에 기사보기가 거기에 있습니다.

디커플링의 수준이 그만한 가치가 있는지 나는 잘 모른다. 때로는 재사용 성을위한 프로그래밍이 처음부터 사용할 수있게 만드는 방식으로 이루어집니다.

+0

이 문장을 좋아합니다. "때로는 재사용 성을위한 프로그래밍이 처음부터 사용할 수있게 만드는 방식에 있습니다." +1 –

1

결합 된 앱을 분리 된 상태로 유지하는 표준 방식 (또는 선호하는 방식)은 조건부 연결을 추가하는 것입니다. 예를 들어 장고 알림을 가져 오려고하는 일부 앱에서와 같이 조건부 연결을 찾은 경우에만 이벤트를보고합니다.

디자인 상 서로 이야기하는 두 개의 앱이있는 경우에는 디커플링을 할 필요가 없습니다. Django에서 다른 앱을 필요로하는 앱을 많이 볼 수 있습니다.

-1

이 경우에는 기사에 대한 사용자의 의존성이 필드가 아니라 메소드에있는 것으로 보입니다. (모델 방법, 모델 클래스 방법 또는 관리자 방법이 중요하지 않음). 그렇다면 메서드 내에서 기사를 게으른 것으로 가져올 수 있습니다. 이 가져 오기가 수행 될 때까지 users.models이 완전히로드되므로 순환 가져 오기 인 경우에도 문제가 발생하지 않습니다. 기사의 "사용자 가져 오기"문은 사용자를 다시로드 할 필요가 없으며 전체 사용자 네임 스페이스를 사용할 수 있습니다.