這可能是一個簡單的Python問題,但是在搜索「導入的名稱未定義」和類似條件後,我沒有找到答案。類定義的可見性
我有一個models.py,由django規定,所有模型的類定義。
然後,我有一個loadtestdata.py,它只是一個編程方式,用一些初始條目填充數據庫。
在loadtestdata.py中,我使用「from myproject.models import *」導入所有模型。
這似乎是因爲loadtestdata.py中的'全局代碼'能夠看到從models.py導入的所有類名。它可以填充數據庫就好。
但是如果我在loadtestdata.py中定義了一個函數,那麼該函數突然間看不到任何導入的類名。
例如,該功能將不會看到ImportedModelName:
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])
不過,我可以寫這一點,它看到ImportedModelName就好
new_model = ImportedModelName()
# set some stuff on the model
new_model.save()
爲什麼前者例如沒有看到導入的類,但後者的例子可以嗎?
編輯:
我砍倒loadtestdata.py其最低限度,這是它
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])
在這個文件中,因爲NameError失敗:名稱「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