これは単純な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
問題を示すファイルのフルバージョンを表示してください。 –
@DanielRoseman、loadtestdata.pyの完全なエントリが追加されました。クラス名 'TestModel'でも私が使用しているものです:) – qeadz
もう一つのことを追加します - 明らかにloadtestdata.pyは 'djangoのコンテキスト内'から実行する必要がありますので、実際にデータベースエントリを作成できます。これは以下のように実行されます:python manage.py shell
qeadz