2010-12-07 39 views
26

當我使用Django shell時,它顯示一個錯誤;這是錯誤:在Django shell中定義模型類失敗

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
... 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "D:\Python25\lib\site-packages\django\db\models\base.py", line 51, in __new__ 
    kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
IndexError: list index out of range 

我該怎麼辦?

+0

在以下討論的類似問題:http://stackoverflow.com/questions/2215403/exception-when-trying-to-install-django-treebeard-based-on-instructions – pyfunc 2010-12-07 22:00:30

+0

嘗試在該位置打印model_module .__ name__ 。 – pyfunc 2010-12-07 22:01:10

回答

44

模型定義必須進來的應用程序 - 你所看到的錯誤,就在於它試圖採取__name__model_module - 這應該是這樣的project.appname.modelsproject\appname\models.py - 並獲得應用程序的名稱,appname。在交互式控制檯中,模塊的__name__'__main__' - 因此失敗。

要解決這個問題,您需要自己在Meta類中指定app_label;

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
...  class Meta: 
...   app_label = 'test' 

對於爲什麼你能做到這一點,看看在回溯提到文件的解釋,D:\Python25\lib\site-packages\django\db\models\base.py

if getattr(meta, 'app_label', None) is None: 
     # Figure out the app_label by looking one level up. 
     # For 'django.contrib.sites.models', this would be 'sites'. 
     model_module = sys.modules[new_class.__module__] 
     kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
    else: 
     kwargs = {} 

(其中metaMeta類,看到的只是上面在該文件中。)

+0

hi @Chris,我的應用名稱是「task2」,所以我應該寫app_label ='task2',是嗎? – zjm1126 2010-12-07 22:27:14

0

這個答案對於交互提示是絕對有效的,但是,我不認爲第一塊代碼的意圖是實際運行的。緊接在the models documentation之後的代碼中,您需要將下一代碼放入上一教程中創建的models.py文件中......我想這就是爲什麼他們巧妙地將該部分標記爲「Quick Example」的原因。太讓我頭痛了!

0

我遇到了這個問題,使用Eclipse,Django和PyDev。我需要在PyDev包資源管理器(左側面板)中選擇應用程序(而不是某些.py文件),然後單擊「運行」以使所有內容正常工作。