peliculas - ¿Alternativa a la obsoleta setup_environ() para scripts django únicos?
django wikipedia (6)
Descargo de responsabilidad: estoy usando Django 1.8
Solo agregando mis 2 centavos: probé algunas de las soluciones presentadas en esta página, pero no funcionaron en absoluto. Acabo de encontrar una solución que comparto a continuación.
Asegúrate de estar en la carpeta raíz de tu proyecto. Lo mismo donde se encuentra manage.py
.
#make sure basic imports are in place
>>> import os,django
#set the specific django settings file
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.base")
# import your modules and use them just like you do in your
# web apps
>>> from apps.customers import models as c
# normal usage... for instance:
>>> dir(c)
[''You'', ''Will'', ''See'', ''Your'', ''Models'', ... ]
setup_environ()
un tiempo para escribir un script de Python único para ejecutarlo desde la línea de comandos que realmente no encajaba muy bien como un comando manage.py personalizado (mi opción preferida). Configuró todo muy bien. Supongo que desaprobamos esta función porque los pitonistas que no usan django se burlan de los djangonauts por cosas mágicas como esta y nos cansamos de sentirnos sucios. Entonces si está en desuso, ¿cuál es la alternativa? Quizás esta es una pregunta perezosa, pero ¿qué necesito para ejecutar en lugar de setup_environ para lograr el mismo efecto? Supongo que podría copiar / pegar la función en mi script, pero supongo que no fue el punto de desaprobarla. (obviamente todavía puedo usar una función en desuso, pero quiero que mi script sobreviva a algunas versiones de django)
Esto ha cambiado en Django 1.7.
import os
import django
from myapp import models
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
print models.MyModel.objects.get(pk=1)
Estoy usando Django 2.0 y Ben Davis está cerca, pero no pude hacerlo funcionar. Lo que parece que me ha funcionado es
import os
import sys
import django
sys.path.append("/path/to/django/project") #only required if project not already in path
os.environ.setdefault(''DJANGO_SETTINGS_MODULE'',''myapp.settings'')
django.setup() #run django.setup BEFORE importing modules to setup the environ
from myapp.models import Thingy
t=Thingly.objects.all()
print(t)
Las notas de lanzamiento de Django 1.4 recomiendan oficialmente usar django.conf.settings.configure()
para establecer la configuración. Esto es bueno para pequeños scripts para los que necesita hacer todo de la manera "pythonic". Sin embargo, si tiene un proyecto más grande, me gusta usar el enfoque de Django que es tener un paquete / módulo de configuración separado y luego su ruta en la variable de entorno DJANGO_SETTINGS_MODULE
. Este es el enfoque que se utiliza en manage.py
:
# manage.py
# ...
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
# ...
Los documentos de lanzamiento se pueden encontrar here .
Para agregar a lo que dijo Leandro N (¡gracias, Leandro!), Debe agregar django.setup ().
Por ejemplo, mi código:
import os, django
os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''myproject.settings'')
django.setup()
from app.models import ModelA, ModelB
Para tu información, estoy en Django 1.10.
Para ampliar la respuesta de miki725, si antes tenías
from django.core.management import setup_environ
import fooproject.settings as settings
setup_environ(settings)
solo reemplaza con
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
from django.conf import settings
y su configuración se cargará como configuración.
Para Django 1.7+, vea la solución de Ben Davis.