Django custom management commands: AttributeError: 'module' object has no attribute 'Command'

Viewed 15546

I am trying to make a custom management command as show in the docs here: https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

When I try to run the command from my project directory I am experiencing the following error:

AttributeError: 'module' object has no attribute 'Command'

Here is the file:

#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.')

The command I am running is :

$ python manage.py event_expiration

I've made sure I am adding the event_expiration.py file within management and commands folders and that those folders have init files. those are in one of my app folders.

Am I overlooking something here? Any help is appreciated, thanks!

EDIT:

Fellow SO user Yuji helped me attempt to debug this a bit but we are still stumped. heres what we did:

First, the full traceback and command:

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

To see what was going on at django/core/management/init.py", line 70 I placed import pdb; pdb.set_trace() within the file.

While in debug mode we tried:

module.__file__ 

to check if the module was where expected, and it indeed was, with an output of:

'/home/matt/Dropbox/PROD/ersvp.it/app/management/commands/event_expiration.pyc'

Next, we tried manually importing Command in the shell:

>>> from app.management.commands.event_expiration import Command 
Traceback (most recent call last):   File "<console>", line 1, in <module> ImportError: cannot import name Command

Still scratching my head!

4 Answers

Printing a queryset directly will also cause this error. For instance, I was trying to do something like this (just testing, not a real use case):

    def handle(self, *args, **options):
       ppl = People.objects.all()
       print(ppl)

Resolution:

    def handle(self, *args, **options):
       ppl = People.objects.all()
       print(str(ppl)) # Convert queryset to string

Conclusion: What works in shell doesn't necessarily work in a management command. Would be nice if someone can point out why.

I got this error by importing the regular click module instead of djclick

my_module/management/commands/run_thing.py

# import click  # causes the error because not setup like djclick is
import djclick as click

@click.command()
@click.option("--thing", required=True, prompt=True)
def command(thing):
    print(f"hi: {thing}"

Example run:

./manage.py run_thing --thing 123
...
hi: 123
Related