ここのドキュメントに示されているように、カスタム管理コマンドを作成しようとしています: https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
プロジェクト ディレクトリからコマンドを実行しようとすると、次のエラーが発生します。
AttributeError: 'module' object has no attribute 'Command'
ファイルは次のとおりです。
#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.')
私が実行しているコマンドは次のとおりです。
$ python manage.py event_expiration
管理フォルダーとコマンドフォルダー内に event_expiration.py ファイルを追加していること、およびそれらのフォルダーに初期化ファイルがあることを確認しました。それらは私のアプリフォルダーの1つにあります。
ここで何かを見落としていますか?どんな助けでも大歓迎です、ありがとう!
編集:
仲間の 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'
django/core/management/init.py で何が起こっているかを確認するために、 70 行目に import pdb; pdb.set_trace() をファイル内に配置しました。
デバッグモードでは、次のことを試しました。
module.__file__
モジュールが期待どおりの場所にあったかどうかを確認するには、次の出力で実際にそうでした。
'/home/matt/Dropbox/PROD/ersvp.it/app/management/commands/event_expiration.pyc'
次に、コマンドをシェルに手動でインポートしてみました。
>>> from app.management.commands.event_expiration import Command
Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: cannot import name Command
まだ頭を掻いています!