2017-06-29 98 views
0

這可能是一個簡單的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 
+3

請顯示演示該問題的完整文件。 –

+0

@DanielRoseman,現在添加loadtestdata.py的完整條目。即使類名'TestModel'就是我正在使用的:) – qeadz

+0

我只需添加另一件事 - 顯然,loadtestdata.py需要從'django的上下文'中運行,因此它實際上可以創建數據庫條目。它通過執行:python manage.py shell qeadz

回答

0

通過解釋這個崗位的工作,我有這(經過一些谷歌搜索)導致了這種隨機的想法:

當我執行我這個做這樣的腳本:

python manage.py shell < loadtestdata.py 

我不知道怎麼說這個功能不同:

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

但後者的作品(是,我在loadtestdata.py定義功能都能夠看到導入的類名),而前者產生的'名稱未定義'錯誤。