【问题标题】:Defining a model class in Django shell fails在 Django shell 中定义模型类失败
【发布时间】:2010-12-07 21:55:15
【问题描述】:

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

我能做什么?

【问题讨论】:

标签: python django


【解决方案1】:

模型定义必须出现在应用程序中 - 您看到的错误是它试图采用 __name__ model_module - 这应该类似于 project.appname.models for project\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 类,请参见该文件的上方。)

【讨论】:

  • 嗨@Chris,我的应用名称是 "task2" ,所以我应该写 app_label = 'task2' ,是吗?
  • @zjm1126:是的,可以的。看到这是在交互式控制台中,这并不重要;我想你只是出于某种原因在搞乱模型 - 如果你想使用 task2 中的内容,当然,你应该使用 from task2.models import Poll
【解决方案2】:

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

【讨论】:

  • 此外,该段继续说“上面的 Person 模型将创建一个类似...的数据库表”,这表明它从未打算按原样实际运行。
【解决方案3】:

我在使用 Eclipse、Django 和 PyDev 时遇到了这个问题。我需要在 PyDev 包资源管理器(左侧面板)中选择应用程序(例如,而不是某些 .py 文件),然后单击“运行”以使一切正常工作。

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多