替代已弃用的 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”?

BitmapDrawable 已弃用的替代方案

替代已弃用的 AudioManager.isWiredHeadsetOn?

已弃用的 AudioManger.setStreamMute 的替代方案?

已弃用的 NSURLConnection 方法,有替代方法吗?

已弃用的 google plus api 的替代解决方案是啥?