如何为 Django 应用程序编写一个无需使用 manage.py shell 即可访问模型的 Python 脚本?

2025-03-20 08:47:00
admin
原创
37
摘要:问题描述:我正在编写一个脚本,将一些模型对象导入到我的 django 应用程序使用的数据库中。过去,我通过运行./manage.py shell然后解决这个问题import myscript。我相信有更好的方法。我希望能够使用从我的 HD 上的任何位置调用脚本python scriptname.py,并且在该...

问题描述:

我正在编写一个脚本,将一些模型对象导入到我的 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()
     ..........
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用