Я использовал setup_environ()
некоторое время назад для написания одноразового питона script, который должен запускаться из командной строки, который действительно не очень хорошо сочетался как пользовательская команда manage.py(мой предпочтительный выбор), Он настроил все хорошо. Я предполагаю, что мы отказались от этой функции, потому что не-django pythonistas высмеивают djangonauts за такие магические вещи, как это, и мы устали чувствовать себя грязными. Так что, если его усталость, какая альтернатива? Может быть, это ленивый вопрос, но зачем мне работать вместо setup_environ, чтобы добиться такого же эффекта? Наверное, я мог бы скопировать/вставить функцию в мой script, но я предполагаю, что это не значит, что она не одобряет ее. (очевидно, я все еще могу использовать устаревшую функцию, но хочу, чтобы мой script выдержал несколько версий django)
Альтернатива устаревшему setup_environ() для одноразовых скриптов django?
Ответ 1
Это изменилось в 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)
Ответ 2
Чтобы расширить ответ miki725, если раньше у вас был
from django.core.management import setup_environ
import fooproject.settings as settings
setup_environ(settings)
просто замените на
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
from django.conf import settings
и ваши настройки будут загружены как настройки.
Для Django 1.7+ см. решение от Ben Davis.
Ответ 3
Примечания к выпуску Django 1.4 официально рекомендуют использовать django.conf.settings.configure()
для установки параметров. Это хорошо для небольших скриптов, для которых вам нужно сделать все "питоническим" способом. Однако, если у вас есть более крупный проект, мне нравится использовать подход Django, который должен иметь отдельный модуль/пакет настроек, а затем его путь в переменной среды DJANGO_SETTINGS_MODULE
. Это подход, который используется в manage.py
:
# manage.py
# ...
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
# ...
Документы о выпуске можно найти здесь.
Ответ 4
Чтобы добавить к тому, что сказал Леандро Н (спасибо, Леандро!), вы должны добавить django.setup().
Например, мой код:
import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
from app.models import ModelA, ModelB
FYI, я на Django 1.10.
Ответ 5
Отказ от ответственности: я использую Django 1.8
Просто добавив свои 2 цента: я пробовал некоторые из решений, представленных на этой странице, но они вообще не работали. Я просто придумал решение, которое я использую ниже.
Убедитесь, что вы находитесь в корневой папке вашего проекта. То же самое, где 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', ... ]