Альтернатива устаревшему setup_environ() для одноразовых скриптов django?

Я использовал setup_environ() некоторое время назад для написания одноразового питона script, который должен запускаться из командной строки, который действительно не очень хорошо сочетался как пользовательская команда manage.py(мой предпочтительный выбор), Он настроил все хорошо. Я предполагаю, что мы отказались от этой функции, потому что не-django pythonistas высмеивают djangonauts за такие магические вещи, как это, и мы устали чувствовать себя грязными. Так что, если его усталость, какая альтернатива? Может быть, это ленивый вопрос, но зачем мне работать вместо setup_environ, чтобы добиться такого же эффекта? Наверное, я мог бы скопировать/вставить функцию в мой script, но я предполагаю, что это не значит, что она не одобряет ее. (очевидно, я все еще могу использовать устаревшую функцию, но хочу, чтобы мой script выдержал несколько версий 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', ... ]