20

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!

3
  • Is the app this is in within INSTALLED_APPS in your settings.py? Commented Aug 11, 2012 at 0:01
  • You should post the debugging we did: it's a big hint what errors you got trying to import the Command from the shell Commented Aug 11, 2012 at 2:17
  • This doesn't answer OP's problem, but for anyone landing here, make sure your class name is actually Command and not YourCustomCommand. Commented Jul 25, 2020 at 14:58

4 Answers 4

37

I ran into the same issue and the problem was that my command class wasn't called exactly Command, as the docs says. Example:

class Command(NoArgsCommand):
    # Do something here
Sign up to request clarification or add additional context in comments.

3 Comments

Fixed the issue for me.
This fixed the issue, but where does it say that in the docs? I can't find it here.
it must define a class Command that extends BaseCommand or one of its subclasses
5

What is your file structure like? It should be like so:

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

If the structure is as above, try the following:

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

I've listed the pure output of running dir on a management command of my own. Give that a try, and report back what is available to the module. You might find yourself getting an error at this point, which may help diagnose. I'm suspecting a problem with importing django itself. I'm guessing the python manage.py shell will fail, which will mean it's not a problem with your command, but a problem with the project.

Edit 2:

The fact that check_expiration was visible in your dir output supports my theory that the folder structure is amiss in someway. Unless there's specifically a function named that within your module.

Please do the following and show the output:

cd /path/to/app/
find .

Also, show the entire contents of your event_expiration.py file, and the contents of your management/commands/__init__.py file. Be wary of spaces mixed with tabs as whitespace also.

6 Comments

Hi Josh, yes this is the file structure. I am running the command from my project directory.
The above commands execute fine Josh, the output is like so: ['Event', 'builtins', 'doc', 'file', 'name', 'package', 'check_expiration', 'datetime']
@mwmnj, check_expiration seems like a weird thing to be available.. Where is check expiration defined? There's something wrong with your folder structure, or folder structure according to python. Is anything defined in your __init__ files that could be affections this?
Geeze, turns out I had two different event_expiration.py files and was editing the one located in my main project directory. :X Thanks for the help, I need to be more careful!
@mwmnj glad you figured it out! I find it funny that you went to the lengths of using pdb, and the actual issue was so much simpler. Isn't our work funny sometimes :P
|
0

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.

Comments

-1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.