2014-10-07 3 views
0

내 장고 앱을위한 몇 가지 기능을 추가하기 위해 새 클래스를 개발 중이며이 클래스에서 상속 한 각 클래스를 검색/수집해야합니다. 나는 이미 가져온 특정 모듈 내에서 모든 것을 스캔 할 수있는 모든 것을 갖추었지만, 각 어플리케이션 내에서 특정 파일을 스캔하는 것이 가장 좋은 방법인지 궁금합니다. ? 나는 다른 애플 리케이션이 이런 일을하고 분명히 장고 자체가 않습니다 알아. 아마도 파일 시스템을 스캔하기 위해 함께 해킹 할 수 있지만이 문제를 해결하는 더 나은/일반적인 방법이 있는지 궁금해하고 있었습니까? 나는 그것에 대해 많이 알 수 없었다.Scan Django App Modules

항상 하나의 패키지 안에 클래스를 정의 할 수 있지만 응용 프로그램에 묶여 있기 때문에 모든 곳에서 모델을 가져 오기보다는 각 응용 프로그램에서 정의하는 것이 가장 좋습니다.

예를 원하는 인터페이스 :

def get_app_implementations(module_name): 
    # ... What's the least hacky way to get each of the app packages? 
    # in a way that they can be imported using __import__ or the likes 
    results = [] 
    for package in packages: 
     try: 
      scanned = __import__("{0}.{1}".format(package,module_name)) 
      results.append(scanned) 
     except ImportError: 
      pass 
    return results 

답변

2

다른 접근 방법을 고려해 볼 수 있습니다. 모델을 스캔하여 관련 항목을 찾지 않고 메타 크라스를 사용하여 모델을 직접 시스템에 등록 할 수 있습니다. Marty Alchin에는이를 수행 할 수있는 간단한 방법이 있습니다.

+0

이것은 유망 해 보이고 훨씬 더 깨끗하게 느껴집니다. 고맙습니다! – RutledgePaulV

+0

django가 import를 명시 적으로 호출 할 필요없이 플러그인을 등록 할 수 있도록 각 app 패키지에 장고 자동 가져 오기를 만드는 방법이 있습니까? ;) – RutledgePaulV

+0

1.7의 새로운 [AppConfig 기능] (https://docs.djangoproject.com/ko/1.7/ref/applications/)과 같은 소리가 원하는 것입니다. –

0

더 나은 솔루션이 있는지 아직도 궁금하지만 다음, 내 요구를 충족 것처럼 그것은 보인다.

#loader.py 
from django.conf import settings 
import importlib 

def load_from_apps(name): 

    results = [] 
    for app in settings.CUSTOM_APPS: 
     try: 
      scanned = importlib.import_module("{0}.{1}".format(app, name)) 
      results.append(scanned) 
     except ImportError: 
      pass 
    return results 



#settings.py 
INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
) 

CUSTOM_APPS = (
    'CustomApp1', 
    'CustomApp2' 
) 

INSTALLED_APPS += CUSTOM_APPS