这可能是一个简单的 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='[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: name 'TestModel' is not defined。
但是,如果我用这个替换函数 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
在解释这篇文章的过程中,我有一个随机的想法(经过一些谷歌搜索)导致了这个:
当我执行脚本时,我这样做:
python manage.py shell < loadtestdata.py
我不知道这在功能上与此有何不同:
python manage.py shell
>>> exec(open('loadtestdata.py').read())
但后者有效(因为我在 loadtestdata.py 中定义的函数能够看到导入的类名)而前者产生“名称未定义”错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句