2017-06-29 11 views
0

これは単純なPythonの質問かもしれませんが、 "インポートされた名前は定義されていません"と類似の条件を検索した後、私はこれに対する答えを見付けませんでした。クラス定義の可視性

私はmodels.pyをdjangoの規定に従ってすべてのモデルのクラス定義と共に持っています。

私はloadtestdata.pyを持っています。これは、データベースにいくつかの初期エントリを入れるプログラム的な方法です。

loadtestdata.py内では、「from myproject.models import *」を使用してすべてのモデルをインポートします。

これはloadtestdata.py内の 'グローバルコード'として動作するようですが、models.pyからインポートされたすべてのクラス名を見ることができます。それはデータベースをうまく読み込むことができます。

しかし私が関数をloadtestdata.pyの中に定義すると、突然その関数はインポートされたクラス名を見ることができません。

def AddSomeEntries(list1): 
    for value in list1: 
    new_model = ImportedModelName() 
    # set some stuff on the model 
    new_model.save() 

AddSomeEntries([1,2,3,4,5]) 

しかし、私はこれを書くことができるし、前者の例は、インポートされたクラスを参照してくださいしないのはなぜそれが

new_model = ImportedModelName() 
# set some stuff on the model 
new_model.save() 

ImportedModelNameだけで罰金見ている:例えば、この機能はImportedModelNameが

は表示されません、後者の例はできますか?

EDIT:

私はその最低限にloadtestdata.pyを削減し、NameErrorので、これはそれが失敗し、このファイルに

from django.contrib.auth.models import User 
User.objects.filter(email='[email protected]').delete() 
User.objects.create_superuser('someuser', '[email protected]', 'somepassword') 

from django.db import models 
from myproject.models import * 

from datetime import datetime 

def AddTestModel(list_data): 
    for entry in list_data: 
     test_model = TestModel() 
     test_model.name = entry 
     test_model.save() 

AddTestModel([1,2,3]) 

です:名「TestModel」が定義されていません。

は、しかし、私はこれで、関数AddTestModelを交換する場合:それは問題なく動作

for entry in [1,2,3]: 
    test_model = TestModel() 
    test_model.name = entry 
    test_model.save() 

。注意:上記は、データベースログインの詳細を変更することを除いて、正確には私のloadtestdata.pyにあるものです。

models.pyはこれで始まる(これは、Djangoは文句を言うので、私は取り除くことができない他の多くのモデル定義がありますが、それらはすべて、確かに「TestModel」名前と衝突しないことができる簡単な定義である):

from django.db import models 

class TestModel(models.Model): 
    name = models.CharField(max_length=50) 
    def __str__(self): 
     return self.name 
+3

問題を示すファイルのフルバージョンを表示してください。 –

+0

@DanielRoseman、loadtestdata.pyの完全なエントリが追加されました。クラス名 'TestModel'でも私が使用しているものです:) – qeadz

+0

もう一つのことを追加します - 明らかにloadtestdata.pyは 'djangoのコンテキスト内'から実行する必要がありますので、実際にデータベースエントリを作成できます。これは以下のように実行されます:python manage.py shell qeadz

答えて

0

は、この記事の説明を通じて取り組んで、私はこれが生じた(一部のGoogleは、検索後の)ランダムな考えを持っていた:私は、スクリプトを実行すると

私はこれをそうやっている:

python manage.py shell < loadtestdata.py 

私は、この機能的に異なっているのか分からない:

python manage.py shell 
>>> exec(open('loadtestdata.py').read()) 

しかし、後者の作品(私はloadtestdata.pyに定義する機能は、インポートされたクラス名を参照することができることである)前者は生産のに対し、 '名前は定義されていません'というエラーです。