这可能是一个简单的Python问题,但是在搜索“未定义的导入名称”和类似标准后,我没有找到答案。
我有一个由django规定的models.py,它具有所有模型的类定义。
然后我有一个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='someemail@here.com').delete()
User.objects.create_superuser('someuser', 'someuser@here.com', '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:name'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
答案 0 :(得分:0)
在解释这篇文章的过程中,我有一个随机的想法(在谷歌搜索之后)导致了这个:
当我执行脚本时,我这样做:
python manage.py shell < loadtestdata.py
我不知道这在功能上有何不同:
python manage.py shell
>>> exec(open('loadtestdata.py').read())
但是后者工作(因为我在loadtestdata.py中定义的函数能够看到导入的类名),而前者产生'name is not defined'错误。