类定义的可见性

卡兹

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章