我正在尝试在这里的文档中显示自定义管理命令:https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
当我尝试从项目目录运行命令时,我遇到以下错误:
AttributeError: 'module' object has no attribute 'Command'
Run Code Online (Sandbox Code Playgroud)
这是文件:
#event_expiration.py
from django.core.management.base import BaseCommand, CommandError
from app.models import Event
import datetime
class Command(BaseCommand):
help = 'deletes expired events'
def handle(self, *args, **options):
today = datetime.datetime.now()
events = Event.objects.filter(date=datetime.date(2011,11,11))
for e in events:
e.delete()
self.stdout.write('Expired events successfully deleted.')
Run Code Online (Sandbox Code Playgroud)
我正在运行的命令是:
$ python manage.py event_expiration
Run Code Online (Sandbox Code Playgroud)
我确保在管理和命令文件夹中添加event_expiration.py文件,并确保这些文件夹具有init文件.那些在我的app文件夹中.
我在这里俯瞰什么吗?任何帮助表示赞赏,谢谢!
编辑:
SO用户Yuji帮助我尝试调试这一点,但我们仍然难过.继承人我们做了什么:
首先,完整的回溯和命令:
(venv)matt@inspirion14z:~/Dropbox/PROD/ersvp.it$ python manage.py event_expiration
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/matt/Dropbox/PROD/ersvp.it/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/home/matt/Dropbox/PROD/ersvp.it/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/matt/Dropbox/PROD/ersvp.it/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 261, in fetch_command
klass = load_command_class(app_name, subcommand)
File "/home/matt/Dropbox/PROD/ersvp.it/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 70, in load_command_class
return module.Command()
AttributeError: 'module' object has no attribute 'Command'
Run Code Online (Sandbox Code Playgroud)
要查看django/core/management/init .py"的内容,第70行我在文件中放置了import pdb; pdb.set_trace().
在调试模式下,我们尝试:
module.__file__
Run Code Online (Sandbox Code Playgroud)
检查模块是否在预期的位置,确实是,输出为:
'/home/matt/Dropbox/PROD/ersvp.it/app/management/commands/event_expiration.pyc'
Run Code Online (Sandbox Code Playgroud)
接下来,我们尝试在shell中手动导入Command:
>>> from app.management.commands.event_expiration import Command
Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: cannot import name Command
Run Code Online (Sandbox Code Playgroud)
还在挠我的头!
Cau*_*ons 26
我遇到了同样的问题,问题是我的命令类没有完全调用Command
,正如文档所说.例:
class Command(NoArgsCommand):
# Do something here
Run Code Online (Sandbox Code Playgroud)
你的文件结构是什么样的?它应该是这样的:
app/
__init__.py
management/
__init__.py
commands/
__init__.py
event_expiration.py
Run Code Online (Sandbox Code Playgroud)
如果结构如上,请尝试以下操作:
python manage.py shell
>>> from app.management.commands import event_expiration
>>> dir(event_expiration)
['Account', 'BaseCommand', 'Callback', 'Command', 'CommandError', 'Comment', 'Status', 'User', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'clean_phone_number', 'csv', 'models', 'os', 're']
Run Code Online (Sandbox Code Playgroud)
我已经列出了dir
在我自己的管理命令上运行的纯输出。试一试,然后向模块报告可用的内容。此时您可能会发现自己收到错误消息,这可能有助于诊断。我怀疑导入 django 本身有问题。我猜python manage.py shell
会失败,这意味着这不是您的命令有问题,而是项目有问题。
编辑2:
check_expiration
在您的dir
输出中可见的事实支持我的理论,即文件夹结构在某种程度上是错误的。除非您的模块中有专门命名为该函数的函数。
请执行以下操作并显示输出:
cd /path/to/app/
find .
Run Code Online (Sandbox Code Playgroud)
此外,显示event_expiration.py
文件的全部内容以及文件的内容management/commands/__init__.py
。小心混有制表符的空格也作为空格。
归档时间: |
|
查看次数: |
11597 次 |
最近记录: |