如何为 Django 应用程序编写一个无需使用 manage.py shell 即可访问模型的 Python 脚本?
- 2025-03-20 08:47:00
- admin 原创
- 38
问题描述:
我正在编写一个脚本,将一些模型对象导入到我的 django 应用程序使用的数据库中。过去,我通过运行./manage.py shell
然后解决这个问题import myscript
。我相信有更好的方法。我希望能够使用从我的 HD 上的任何位置调用脚本python scriptname.py
,并且在该脚本的前几行中,它将执行任何必要的导入/其他操作,以便它可以访问模型对象并表现得像使用运行一样manage.py shell
。
我需要在脚本中添加什么才能实现这一点?
编辑:
根据@Melug 的回答,并添加动态设置 Python 路径来解决问题的‘我的 HD 上的任何地方’部分:
import sys
sys.path.append('c:\\my_projec_src_folder')
from myproject import settings
from django.core.management import setup_environ
setup_environ(settings)
解决方案 1:
从 Django 1.4 开始,你应该避免使用setup_environ(settings)
(Melug 的帖子),因为它已被弃用。改用以下内容,你将能够访问你的模型
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
# your imports, e.g. Django models
from your_project_name.models import Location
# From now onwards start your script..
以下是访问和修改模型的示例:
if __name__ == '__main__':
# e.g. add a new location
l = Location()
l.name = 'Berlin'
l.save()
# this is an example to access your model
locations = Location.objects.all()
print locations
# e.g. delete the location
berlin = Location.objects.filter(name='Berlin')
print berlin
berlin.delete()
示例模型:
class Location(models.Model):
name = models.CharField(max_length=100)
解决方案 2:
为了加载模型,我必须将其与这个答案结合起来,否则我会得到django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
import django
django.setup()
另外,我将其添加到__init__.py
我的 django 项目中,它将自动发现应用程序名称,以便可以复制/粘贴:
import os
def setup():
module = os.path.split(os.path.dirname(__file__))[-1]
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(module))
import django
django.setup()
然后我可以这样做:
from <app> import setup
setup()
解决方案 3:
对于 Django 1.9 或更高版本,你可以使用以下命令:
import sys
import os
import django
sys.path.append('your_project_directory')
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_project.settings'
django.setup()
from yourapp.models import your_model
因此你可以使用与 django 对象相同的对象:
from myapp.models import Locations
all_locations = Locations.object.all()
first_location = Locations.object.get(id=1)
print first_location.name()
first_location.save()
解决方案 4:
我认为最好的方法是创建自定义管理命令。然后您可以manage.py <yourcommand>
从任何地方调用。
解决方案 5:
您需要先设置 django 环境:
from your_project import settings
from django.core.management import setup_environ
setup_environ(settings)
最后导入你的模型,一切都像 django 一样。
解决方案 6:
适用于 DJANGO 1.11
上面的解决方案不起作用,但给了我一个错误:
django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。
对我来说,这里的解决方案是:
import os
from django.core.wsgi import get_wsgi_application
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
解决方案 7:
从 Django 1.11 开始,您的主应用程序包含一个 wsgi 模块,该模块在导入时执行必要的设置。假设myproject/myproject
您的 settings.py 位于此处,则在您的脚本中只需导入:
from myproject.wsgi import application
解决方案 8:
以下是针对 Django 版本 > 1.4 的答案:
from django.core.management import settings
from myproject.myproject import settings as project_settings
if not settings.configured:
settings.configure(default_settings=project_settings)
解决方案 9:
如果你得到:
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
尝试:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()
解决方案 10:
对于 django >= 2.0 来说,只需进行这 2 次导入即可
from your_project_path import settings as your_project_settings
from django.core.management import settings
那么你就可以这样做from my_app.models import MyModel
并与你的模型一起工作MyModel
解决方案 11:
尝试:
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
如果os.environ.setdefault
不起作用。(Windows 10,python3.6.4,django 2.0.3)
解决方案 12:
正如 Stavros在此处指出的那样,您只需复制 wsgi.py 并将其放在脚本的开头即可。除了设置 DJANGO_SETTINGS_MODULE 之外,您还需要获取应用程序。希望对您有所帮助。它在 django 2.1.5 上对我有用。
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'revochem.settings')
application = get_wsgi_application()
解决方案 13:
上面的许多答案都是正确的,但没有参考官方文档。
首先,您需要配置设置或设置DJANGO_SETTINGS_MODULE
环境变量
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
然后文档指定:
设置
DJANGO_SETTINGS_MODULE
或调用
后configure()
,您需要调用django.setup()
来加载设置并填充 Django 的应用程序注册表。例如:import django from django.conf import settings from myapp import myapp_defaults settings.configure(default_settings=myapp_defaults, DEBUG=True) django.setup() # Now this script or any imported module can use any part of Django it needs. from myapp import models ```
该文档还包括一个重要警告:
django.setup()
只能被调用一次。因此,请避免将可重复使用的应用程序逻辑放在独立脚本中,因为这样您必须从应用程序的其他位置导入脚本。如果无法避免,请将对 django.setup() 的调用放在 if 块中:
if __name__ == '__main__': import django django.setup()
解决方案 14:
您必须事先声明一个环境变量“DJANGO_SETTINGS_MODULE”。此环境变量将在您调用 django.setup() 时使用
set DJANGO_SETTINGS_MODULE=YOUR_PRJ.settings
然后
python django_script.py
在 Linux 上,使用export
而不是set
。
django_script:
if __name__ == "__main__":
import django
django.setup()
..........
扫码咨询,免费领取项目管理大礼包!