20

이것은 꽤 간단한 장고 패턴 질문입니다. 내 매니저 코드는 대개 models.py에 있지만, models.py가 정말 큰 경우 어떻게됩니까? maintainability와 순환 수입을 피하기 위해 매니저 코드를 models.py에 살게하는 다른 대안적인 패턴이 있습니까?Django 관리자 코드는 어디에 살고 있습니까?

models.py가 왜 그렇게 큰지에 대한 질문이 있지만, 크기와 유틸리티의 폭이 정당하다고 가정 해 봅시다.

답변

21

내 모델을 models.py에 보관하고 managers.py (forms.py의 양식)에있는 관리자를 동일한 앱 내에 보관하는 것을 선호합니다. 좀 더 일반적인 관리자의 경우, 다른 애플 리케이션을 위해 재사용 할 수 있다면 그들을 core.managers에 두는 것을 선호합니다. model/modelname.py를 가진 우리의 더 큰 애플 리케이션 중 일부는 매니저와 나쁜 모델이 아닌 모델 코드를 포함합니다.

+1

그런 다음 어떻게하면 models.py를 import해야하는 models.py를 어떻게 처리합니까? 그 반대의 경우도 마찬가지입니까? – Jeff

+24

managers.py는 모델을 가져올 필요가 없습니다. 문제의 모델은 항상 매니저에서'self.model '로 사용할 수 있습니다. – jacobian

+5

관리자의 QuerySet이 다른 모델을 참조해야하는 경우가 아니라면 가져올 수 없으며 models.py에 배치해야합니다 (예 : 다른 모델에있는 항목을 제외하는 경우 등). –

3

Django 응용 프로그램을 빌드 할 때 특정 모델 코드, 관리자 코드 및 때로는 양식 코드로 [modelname] .py 파일을 작성한 다음 __init__.py 파일을 사용하여 models 디렉토리에있는 모든 파일을 가져 오는 것이 었습니다. 이것은 그것이 관리 할 수있는 유지에 atleast 도움이되었습니다.

+0

만약 내가 이것을하려고한다면, 나는이 모든 파일들을'models' 폴더 안에 넣을 것입니다. 그것은 애플 리케이션 루트를 깨끗하게 유지하고 더 나은 수입을 구성합니다. – jangeador

6

저는 항상 managers.py에 저를 배치합니다. 순환 가져 오기 문제가있는 경우 a) self.model의 관리자에 대한 모델 클래스를 참조 할 수 있고 b) 함수 내부에서 가져 오기를 수행 할 수 있음을 기억하십시오.

+0

+1은 함수 내부로 가져올 수 있음을 상기시켜줍니다. 필자의 경우 관리자를 위해 외부 모델을 사용해야했고, 메소드 내부에''apps.get_model (app_label = 'app_name', model_name = 'model_name')''을 추가했습니다. – jangeador

7

큰 세트의 모델을 사용하는 가장 좋은 방법은 장고 모듈을 사용하는 것입니다. 간단히 models라는 폴더를 만듭니다. 이전 models.py를이 모델 폴더로 이동하고 이름을 __init__.py으로 바꿉니다. 이렇게하면 각 모델을이 모델 폴더의 특정 파일로 분리 할 수 ​​있습니다.

그러면 각 모델을 __init__.py의 네임 스페이스로 가져 오기 만하면됩니다. 그런 다음 __init__.py 단지가 될 수

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

:

그래서, 예를 들어, 당신은으로 분리 할 수 ​​있습니다이 내 모델 파일을받을 때 사용하는 구조는

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

거대한, 그러나 나는 가능한 한 자주 더 많은 플러그 형 응용 프로그램으로 분리하려고 노력한다. 그래서 이것은 나에게 거의 사용되지 않는다.

희망이 도움이됩니다.

관련 문제