替代已弃用的setup_environ()用于一次性django脚本?

Ben*_*rts 46 django

我用setup_environ()了一段时间来编写一个一次性的python脚本,从命令行运行,根本不适合作为自定义manage.py命令(我的首选).它很好地设置了一切.我假设我们不赞成这个功能,因为非django pythonistas取笑djangonauts这样的魔法东西,我们厌倦了感觉很脏.所以,如果它被弃用,那么替代方案是什么?也许这是一个懒惰的问题,但我需要用什么来代替setup_environ来实现同样的效果呢?我想我可以将该函数复制/粘贴到我的脚本中,但我认为这不是弃用它的重点.(显然我仍然可以使用一个已弃用的函数,但我希望我的脚本能够存活几个版本的django)

Ben*_*vis 58

这在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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ian 28

要扩展miki725的答案,如果有的话

from django.core.management import setup_environ

import fooproject.settings as settings
setup_environ(settings)
Run Code Online (Sandbox Code Playgroud)

只需更换

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

并且您的设置将作为设置加载.

对于Django 1.7+,请参阅Ben Davis的解决方案.


mik*_*725 21

Django 1.4发行说明官方建议django.conf.settings.configure()用于设置设置.这对于需要以"pythonic"方式执行所有操作的小脚本来说非常有用.但是如果你有一个更大的项目,我喜欢使用Django方法,即拥有一个单独的设置模块/包,然后在DJANGO_SETTINGS_MODULE环境变量中使用它的路径.这是用于以下方法的方法manage.py:

# manage.py

# ...
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
# ...
Run Code Online (Sandbox Code Playgroud)

发布文档可以在这里找到.

  • 使用Django 1.6,`manage.py`现在有了建议的行:`os.environ.setdefault("DJANGO_SETTINGS_MODULE","myproject.settings")`但是当我尝试启动shell时它仍然会抛出同样的错误在原来的问题. (3认同)