在Django shell中定义模型类失败

时间:2010-12-07 21:55:15

标签: python django

当我使用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

我该怎么办?

3 个答案:

答案 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 = {}

(其中metaMeta类,请参阅该文件中的上方。)

答案 1 :(得分:0)

其他答案肯定适用于交互式提示,但是,我不认为第一个代码块的意图是为了实际运行。紧跟在the models documentation中的代码之后,您需要将下一个代码放入上一个教程中创建的models.py文件中...我猜这就是为什么他们巧妙地将该部分标记为“快速示例”。对我来说也很头疼!

答案 2 :(得分:0)

我使用Eclipse,Django和PyDev遇到了这个问题。我需要在PyDev Package Explorer(左侧面板)中选择应用程序(例如,而不是一些.py文件),然后单击Run以使一切正常工作。