18

ここのドキュメントに示されているように、カスタム管理コマンドを作成しようとしています: 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

まだ頭を掻いています!

4

4 に答える 4

31

私は同じ問題に遭遇しました。問題はCommand、ドキュメントにあるように、コマンド クラスが正確に呼び出されなかったことです。例:

class Command(NoArgsCommand):
    # Do something here
于 2013-07-17T13:53:12.970 に答える
5

あなたのファイル構造はどのようなものですか?次のようになります。

app/
    __init__.py
    management/
        __init__.py
        commands/
            __init__.py
            event_expiration.py

構造が上記の場合は、次のことを試してください。

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']

dir私自身の管理コマンドで実行した純粋な出力をリストしました。それを試して、モジュールで利用できるものを報告してください。この時点でエラーが発生する可能性があり、診断に役立つ場合があります。django 自体のインポートに問題があると思われます。これはpython manage.py shell、コマンドの問題ではなく、プロジェクトの問題であることを意味します。

編集2:

check_expiration出力に表示されたという事実dirは、フォルダー構造が何らかの形で間違っているという私の理論を裏付けています。モジュール内にその名前の関数が特にない限り。

以下を実行して、出力を表示してください。

cd /path/to/app/
find .

event_expiration.pyまた、ファイルの内容全体とファイルの内容を表示しmanagement/commands/__init__.pyます。タブと空白が混在するスペースにも注意してください。

于 2012-08-11T01:46:27.913 に答える