python - queryset - objects.filter django
Cómo volver a cargar los módulos en django shell? (9)
En lugar de ejecutar comandos desde el shell de Django, puede configurar un comando de administración como ese y volver a ejecutarlo cada vez.
Estoy trabajando con Django y uso el shell de Django todo el tiempo. La parte molesta es que mientras el servidor de Django se recarga en los cambios de código, el shell no lo hace, así que cada vez que hago un cambio en un método que estoy probando, necesito salir del shell y reiniciarlo, volver a importar todos los módulos que Necesito, reiniciar todas las variables que necesito, etc. Mientras que el historial de iPython ahorra mucho tipeo en esto, esto sigue siendo un problema. ¿Hay alguna manera de hacer que django shell recargue automáticamente, de la misma manera que lo hace el servidor de desarrollo django?
Sé acerca de reload (), pero importo muchos modelos y, en general, uso from app.models import *
syntax, así que reload () no es de mucha ayuda.
Mi solución es escribir el código y guardarlo en un archivo y luego usar:
shell python manage.py <test.py
Así que puedo hacer el cambio, guardar y ejecutar ese comando nuevamente hasta que solucione lo que sea que esté tratando de solucionar.
Mi solución para este inconveniente sigue. Estoy usando IPython.
$ ./manage.py shell
> import myapp.models as mdls # ''mdls'' or whatever you want, but short...
> mdls.SomeModel.objects.get(pk=100)
> # At this point save some changes in the model
> reload(mdls)
> mdls.SomeModel.objects.get(pk=100)
Espero eso ayude. Por supuesto, es para depuración.
Aclamaciones.
No es exactamente lo que quieres, pero ahora tiendo a construirme comandos de administración para probar y jugar con cosas.
En el comando, puede configurar un grupo de locales de la manera que desee y luego pasar a un shell interactivo.
import code
class Command(BaseCommand):
def handle(self, *args, **kwargs):
foo = ''bar''
code.interact(local=locals())
Sin recarga, pero una forma fácil y menos molesta de probar interactivamente la funcionalidad django.
Parece que el consenso general sobre este tema es que python reload () es una mierda y no hay una buena manera de hacerlo.
Recomiendo usar el proyecto django-extensions como se indicó anteriormente mediante dongweiming. Pero en lugar de simplemente el comando de administración ''shell_plus'', use:
manage.py shell_plus --notebook
Esto abrirá un cuaderno IPython en su navegador web. Escriba su código allí en una celda, sus importaciones, etc. y ejecútelo.
Cuando cambie sus módulos, simplemente haga clic en el elemento del menú del cuaderno ''Kernel-> Restart''
Ahí va, su código ahora está usando sus módulos modificados.
Reload () no funciona en el shell de Django sin algunos trucos. Puedes consultar este hilo na y mi respuesta específicamente:
Sugeriría usar la ipython.org/ipython-doc/3/config/extensions/autoreload.html IPython.
./manage.py shell
In [1]: %load_ext autoreload
In [2]: %autoreload 2
Y a partir de ahora todos los módulos importados se actualizarían antes de evaluar.
In [3]: from x import print_something
In [4]: print_something()
Out[4]: ''Something''
# Do changes in print_something method in x.py file.
In [5]: print_something()
Out[5]: ''Something else''
Funciona también si se importó algo antes del comando %load_ext autoreload
.
./manage.py shell
In [1]: from x import print_something
In [2]: print_something()
Out[2]: ''Something''
# Do changes in print_something method in x.py file.
In [3]: %load_ext autoreload
In [4]: %autoreload 2
In [5]: print_something()
Out[5]: ''Something else''
También es posible evitar que algunas importaciones se %aimport
comando %aimport
y 3 estrategias de autorrecarga:
% autorecarga
- Recargue todos los módulos (excepto los excluidos por% aimport) automáticamente ahora.
% autorecarga 0
- Desactiva la recarga automática.
% autorecarga 1
- Recargue todos los módulos importados con% aimport cada vez antes de ejecutar el código de Python escrito.
% autorecarga 2
- Vuelva a cargar todos los módulos (excepto los excluidos por% aimport) cada vez antes de ejecutar el código de Python escrito.
% aimport
- Lista los módulos que se importan o no se importan automáticamente.
% aimport foo
- Importe el módulo ''foo'' y márquelo para que se recargue automáticamente para% autoreload 1
% aimport -foo
- Marque el módulo ''foo'' para que no se recargue automáticamente.
Esto generalmente funciona bien para mi uso, pero hay algunas cavetas:
- La sustitución de objetos de código no siempre tiene éxito: el cambio de una @property en una clase a un método ordinario o un método a una variable de miembro puede causar problemas (pero solo en objetos antiguos).
- Las funciones que se eliminan (por ejemplo, a través de parche de mono) desde un módulo antes de volver a cargarlas no se actualizan.
- Los módulos de extensión C no se pueden volver a cargar y, por lo tanto, no se pueden volver a cargar automáticamente.
mire el comando manage.py shell_plus provisto por el proyecto django-extensions . Cargará todos sus archivos de modelo en el inicio del shell. y recargar automáticamente cualquier modificación pero no necesita salir, puede llamar directamente allí