2011-09-02 4 views
24
>>> from django.core.management import call_command 
>>> call_command('syncdb') 

esegue il comando di gestione syncdb da uno script python. Tuttavia, voglio eseguire l'equivalente diCome posso eseguire `syncdb --noinput` di Django con call_command?

$ python manage.py syncdb --noinput 

all'interno di una shell o script python. Come lo posso fare?

Le seguenti righe non funzionano senza interromperlo con la domanda se voglio creare un superutente.

>>> call_command('syncdb', noinput = True) # asks for input 
>>> call_command('syncdb', 'noinput') # raises an exception 

Io uso Django 1.3.

+2

Risolto: 'call_command ('syncdb', interactive = False)' – pvoosten

+0

Duplicato di [questa domanda] (http://stackoverflow.com/questions/2772990/programmatically-sync-the-db-in-django)? –

+2

@lbp non si dovrebbe inserire la soluzione in un commento, ma in una risposta e quindi accettarla. altrimenti questa domanda sarà senza una risposta accettata per sempre. –

risposta

42
call_command('syncdb', interactive = False) 

EDIT:

ho trovato la risposta nel codice sorgente. Il codice sorgente per tutti i comandi di gestione può essere trovato in un modulo Python chiamato management/commands/(command_name).py

Il modulo python in cui risiede il comando syncdb è django.core.management.commands.syncdb

per trovare il codice sorgente del comando è possibile fare qualcosa di simile:

(env)$ ./manage.py shell 
>>> from django.core.management.commands import syncdb 
>>> syncdb.__file__ 
'/home/user/env/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.pyc' 
>>> 

Ovviamente, controllare il contenuto di syncdb.py e non syncdb.pyc.

O guardando il online source, lo script syncdb.py contiene:

make_option('--noinput', action='store_false', dest='interactive', default=True, 
     help='Tells Django to NOT prompt the user for input of any kind.'), 

che ci dice che invece di --noinput sulla riga di comando, dovremmo usare interactive se vogliamo per automatizzare i comandi con la funzione call_command.

+0

Qualcuno sa perché usi 'interactive' invece di' noinput'? È presente nei documenti di Django ovunque? –

+0

Per quanto posso dire, la documentazione su questo argomento è piuttosto oscura. C'è un esempio qui: https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code – pvoosten

+0

Grazie mille per la risposta – ihatecache

Problemi correlati