替代已弃用的 setup_environ() 一次性 django 脚本?
Posted
技术标签:
【中文标题】替代已弃用的 setup_environ() 一次性 django 脚本?【英文标题】:Alternative to the deprecated setup_environ() for one-off django scripts? 【发布时间】:2013-02-09 12:48:39 【问题描述】:不久前我使用setup_environ()
编写了一个一次性的python 脚本,该脚本可以从命令行运行,但它根本不适合作为自定义manage.py 命令(我的首选)。它很好地设置了一切。我假设我们弃用了这个函数,因为非 django pythonistas 拿 djangonauts 取笑这种神奇的东西,我们厌倦了感觉肮脏。那么,如果它已被弃用,还有什么替代方案?也许这是一个懒惰的问题,但是我需要运行什么来代替 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)
【讨论】:
这在 1.7.3 django.setup() 上对我不起作用 AttributeError: 'module' object has no attribute 'setup' 仔细检查以确保您正确导入内容(并确保您的路径正确)。 1.7.3应该有设置功能:github.com/django/django/blob/1.7.3/django/__init__.py django.setup() 在 1.8 django 版本中添加。它在 1.7 中不起作用。 docs.djangoproject.com/en/1.8/topics/settings【参考方案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 的解决方案。
【讨论】:
这不适用于 django 1.6 - 我已将项目路径(不是应用程序)添加到 sys.path,我已将设置模型添加到 DJANGO_SETTINGS_MODULE 然后从 django.conf 导入设置,但如果我随后尝试导入我的一个数据库模型(从 shoppinglist.models 导入 ShoppingList),则会出现错误“没有名为模型的模块”。相同的导入行在通过 manage.py 启动的 shell 中工作。有什么想法吗? 如果你不能导入模型,听起来你的路径值设置不正确,这超出了这个问题关于设置的范围。您应该尝试在使用“python”启动的常规 python shell 中进行测试,而不是使用“manage.py shell”启动的 django shell 来调试您的路径。【参考方案3】:Django 1.4 发行说明官方推荐使用django.conf.settings.configure()
进行设置。这对于您需要以“pythonic”方式完成所有操作的小型脚本非常有用。但是,如果您有一个更大的项目,我喜欢使用 Django 方法,它有一个单独的设置模块/包,然后它的路径位于 DJANGO_SETTINGS_MODULE
环境变量中。这是manage.py
中使用的方法:
# manage.py
# ...
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings")
# ...
可以在here找到发布文档。
【讨论】:
使用 Django 1.6,manage.py
现在有建议的行:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
,但是当我尝试启动 shell 时,它仍然抛出与原始问题相同的错误。【参考方案4】:
要添加 Leandro N 所说的内容(谢谢,Leandro!),您必须添加 django.setup()。
比如我的代码:
import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
from app.models import ModelA, ModelB
仅供参考,我使用的是 Django 1.10。
【讨论】:
【参考方案5】:我正在使用 Django 2.0,Ben Davis 很接近,但我无法让它工作。似乎对我有用的是
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)
【讨论】:
【参考方案6】:免责声明:我使用的是 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', ... ]
【讨论】:
不在根目录下怎么办?以上是关于替代已弃用的 setup_environ() 一次性 django 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
是否有快速替代已弃用的“SKPaymentTransaction.transactionReceipt”?
替代已弃用的 AudioManager.isWiredHeadsetOn?
已弃用的 AudioManger.setStreamMute 的替代方案?