当我使用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 :(得分:44)
模型定义必须出现在应用程序中 - 您看到的错误是它尝试使用__name__
model_module
- 对于{{project.appname.models
应该是project\appname\models.py
1}} - 并获取应用名称appname
。在交互式控制台中,模块__name__
为'__main__'
- 因此失败。
要解决此问题,您需要在app_label
课程中自己指定Meta
;
>>> 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 = {}
(其中meta
是Meta
类,请参阅该文件中的上方。)
答案 1 :(得分:0)
其他答案肯定适用于交互式提示,但是,我不认为第一个代码块的意图是为了实际运行。紧跟在the models documentation中的代码之后,您需要将下一个代码放入上一个教程中创建的models.py文件中...我猜这就是为什么他们巧妙地将该部分标记为“快速示例”。对我来说也很头疼!
答案 2 :(得分:0)
我使用Eclipse,Django和PyDev遇到了这个问题。我需要在PyDev Package Explorer(左侧面板)中选择应用程序(例如,而不是一些.py文件),然后单击Run以使一切正常工作。