2016-08-23 2 views
1

나는 장고 1.8.2 프로젝트에서 일하고있다.Django 쿼리를 수행하는 이유는 무엇입니까? django.core.exceptions.AppRegistryNotReady : 모델이 아직로드되지 않았습니까?

이 프로젝트에는 여러 장고 응용 프로그램이 있습니다. 다음과 같이

응용 프로그램 app_a 클래스 MyClassA을 가지고 다음과 같이

class MyClassA(models.Model): 
    name = models.CharField(max_length=50, null=True, blank=True) 

    @staticmethod 
    def my_static_method(): 
     ret_val = MyClassA.objects.filter() 
     return "World" 

응용 프로그램 app_b 클래스 MyClassB을 가지고 : 나는 manage.py test을 실행하면

class MyClassB(models.Model): 
    name = models.CharField(max_length=50, null=False, blank=False) 
    def my_method(self, arg1=MyClassA.my_static_method()): 
     return "Hello" 

, 그것은 잘 작동합니다. 그것은 다음과 같은 오류와 함께 실패, 내가 그렇게 할 때

@staticmethod 
def my_static_method(): 
    ret_val = MyClassA.objects.filter(name=None) 
    return "World" 

다음 manage.py test을 실행합니다 :

File "my-virtual-env/lib/python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready 
    raise AppRegistryNotReady("Models aren't loaded yet.") 
    django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

왜 이런 일이

그러나, 나는이 다음에 MyClassA.my_static_method()을 변경? 이 문제를 어떻게 해결할 수 있습니까?

내가 만든 유일한 변경 사항은 필터 값 name=None을 추가하는 것입니다.

+0

1. 당신은 INSTALLED_APPS''에서'app_b' 전에'app_a'이 있습니까? 2.'name = None' 필터를 추가 할 때 예외가 발생하는 이유는 다음과 약간 다를 수 있습니다. https://docs.djangoproject.com/en/1.10/topics/ db/queries/# querysets-are-lazy입니다. 즉,'filter()'를 호출 할 때 쿼리가 평가되지 않을 가능성이 있으므로 문제를 숨길 수 있다고 생각합니다. 빈'filter()'예제에'print (ret_val)'을 추가하면 같은 일이 일어날 수도 있습니다. – elethan

+0

1. 예. 2. 빈 필터로'print ret_val'을 추가해도 에러가 발생하지 않습니다. 특히 이것은 런타임 오류가 아닙니다. 'MyClassB.my_method()'는 절대로 호출되지 않기 때문에 이것은 컴파일 타임 오류입니다. –

답변

1

Django에서는 가져 오기시 쿼리를 실행하지 않아야합니다. (자세한 내용은 here를 참조하십시오.)

함수가 정의 될 때 (이 호출 될 때 반대) 파이썬에서 기본 인수 값이, 당신의 MyClassB.my_method() 정의 쿼리를 실행하려고 시도하는 MyClassA.my_static_method()를 호출 평가 때문이다.

왜 한 버전의 코드에서 오류가 발생 했습니까? 그들 중 하나가 어떤 이유로 든 쿼리를 평가하고 (즉, 데이터베이스에 액세스하려고 시도 중) 하나는 그렇지 않습니다. 가져 오기를 할 때 수행하는 작업이 데이터베이스에 액세스하려고 시도하지 않도록하는 것은 사용자의 책임입니다.

당신의 목표는 그 기본 인수의 경우

는 각 호출에 평가하는 파이썬의 표준 관용구는 다음과 같습니다

def my_method(self, arg1=None): 
    if arg1 is None: 
     arg1 = MyClassA.my_static_method() 
0

이 경우 관리자 기능에서 실수 한 경우에만 오류가 발생합니다. 나는 같은 것을 시도했고 그것은 나를 위해 일했다. 하지만 필터(). MyClassA.objects.filter (a_field_not_in_the_model = None)과 같은 오류가 발생했을 때 같은 오류가 발생했습니다.

원본 코드를 다시 확인해야한다고 생각합니다. 모델이 괜찮은지 확인하십시오.

관련 문제