2016-09-02 4 views
1

마이 그 레이션에서 다른 모듈의 함수를 호출하는 사용자 지정 명령을 실행하고 싶습니다. 이 함수는 일부 모델을 사용하며 예상대로 스키마 버전이 일치하지 않습니다 (OperationalError: (1054, "Unknown column 'foo' in 'bar'"))버전이있는 앱 레지스트리의 모델을 전체적으로 사용하십시오.

사용자 지정 명령에서 해당 모델을 사용하려면 apps.get_model('my_app', 'bar')으로 모델에 액세스하지만 해당 모델이 외부 함수, 내가 그렇게 할 수 없습니다.

난 아무것도 찾을 수 있지만 나는 확실히 누군가가 전에이로 실행하고 있습니다.

나는 unittest.mock.patch 장식을 사용하는 방법에 대해 생각하지만 그것은 생각하지 않습니다 올바른 솔루션처럼.

나는 이것에 대한보다 일반적인 해결책은 무엇입니까?

답변

2

버전이있는 앱 레지스트리는 전역 적으로 액세스 할 수 없습니다. 당신은 함수에 매개 변수로 모델을 통과하고, 기본적으로 현재의 모델을 사용할 수 있습니다 : 당신은 그것을 호출 할 때 일반 코드에서 호출하지만, 경우 bar_model 매개 변수를 전달하지 않아도

from my_app.models import Bar 

def my_function(..., bar_model=Bar): 
    # Use bar_model instead of Bar 

# Your RunPython function 
def migrate_something(apps, schema_editor): 
    my_function(bar_model=apps.get_model('my_app', 'bar')) 

이전에서 이전 모델을 전달할 수 있습니다. 여러 모델이 필요하면

대신 apps을 전달할 수 :

from django.apps import apps as global_apps 

def my_function(..., apps=global_apps): 
    Bar = apps.get_model('my_app', 'bar') 
+0

을 요점 그 : 나는 모델로 작동 추가 기능을 외부 함수는 생산에서 실행으로 모델 주위에 통과 방지하고 전화를하고 싶습니다 그것들을 변경하면 오류가 발생하기 쉽습니다. 어떻게 든 원숭이 패치를하고 싶었지만 가능하지 않다는 것을 알았 기 때문에이 기능을 관리 명령으로 추가하고 수동으로 실행합니다. – fodma1

관련 문제