类定义的可见性

时间:2017-06-29 21:23:39

标签: python django

这可能是一个简单的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

1 个答案:

答案 0 :(得分:0)

在解释这篇文章的过程中,我有一个随机的想法(在谷歌搜索之后)导致了这个:

当我执行脚本时,我这样做:

python manage.py shell < loadtestdata.py

我不知道这在功能上有何不同:

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

但是后者工作(因为我在loadtestdata.py中定义的函数能够看到导入的类名),而前者产生'name is not defined'错误。