2016-08-23 6 views
1

私はDjango 1.8.2プロジェクトに取り組んでいます。Djangoクエリーを実行するのはなぜですか:django.core.exceptions.AppRegistryNotReady:モデルはまだロードされていませんか?

このプロジェクトには、複数のDjangoアプリケーションがあります。次のように

アプリケーション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があります

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" 

私はmanage.py testを実行すると、それが正常に動作します。それは次のエラーで失敗し、私はそれを行うとき

@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を参照してください。)

を関数が定義されている場合はPythonのデフォルト引数値が評価されているので(それが呼び出されたときとは反対に)、あなたのMyClassB.my_method()定義は、クエリを実行しようとしている、MyClassA.my_static_method()を呼んでいます。

なぜコードの1つのバージョンでエラーが発生しましたか?そのうちの1人が何らかの理由でクエリを評価しています(データベースにアクセスしようとしています)。インポート時に行うことが何もデータベースへのアクセスを試みないようにすることは、あなたの責任です。

あなたの目標は、呼び出しごとに評価されるために、そのデフォルトの引数にある場合は、Pythonでの標準的なイディオムは次のとおりです。

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)のようなエラーで同じエラーが発生しました。

元のコードをもう一度確認する必要があると思います。モデルが正常かどうかを確認してください。

関連する問題