独立进程使用django模型(django.setup()使用)

这篇具有很好参考价值的文章主要介绍了独立进程使用django模型(django.setup()使用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

独立进程使用django模型

通过在独立进程中使用 Django 模型,你可以充分利用 Django 框架提供的数据库访问和模型层功能,更方便地进行数据处理、任务处理和与其他系统的集成。它提供了一种简单且高效的方式来利用 Django 强大的功能,并使你的代码更易于维护和扩展。

独立进程使用django模型 步骤

  1. 在独立进程的代码文件开头,需要设置 Django 的环境变量,以使其能够正确加载和使用 Django 框架。添加以下代码:
import os
import django

# 设置 DJANGO_SETTINGS_MODULE 环境变量(引入settings文件)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')

# 加载 Django 项目配置
django.setup()
  1. 在独立进程中导入需要使用的 Django 模型,可以直接使用 from your_app.models import YourModel 这样的导入语句来引入需要的模型类。

注意:在独立进程中使用 Django 模型需要确保你的 Django 项目已正确配置并且数据库连接可用。同时,你在独立进程中的代码修改不会自动触发 Django 的信号和中间件,因此需要手动处理相关逻辑。

django.setup()

django.setup() 是 Django 中的一个函数,主要用于设置 Django 的环境和配置。它需要在使用 Django 模型之前调用,以确保 Django 的各项功能能够正常工作。

第一个过程是从INSTALLED_APP中导入每一个内容,这个过程中代码不应该导入任何models,即使是间接的导入。
第二个过程Django尝试导入models中的子模块,并且必须通过models.py和models/init.py。
第三个过程是调用每个application的ready()方法。

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
django.setup()

DJANGO_SETTINGS_MODULE环境变量已告知Django使用哪个settings.py文件。
Django会自动根据这个settings.py文件,加载其中的INSTALLED_APPS配置,完成必要的应用初始化。

RuntimeError: populate() isn’t reentrant

独立进程的入口调用了django.setup(),但是独立进程在import其他 模块.py文件,其他py文件中又import了其他django模型。
但是在这个引入的py中你又不能再调 django.setup(),因为这个东西只能调一次。

解决思路:
通过apps.get_model()来导入模型,避免重复调用django.setup()

apps.get_model() 是 Django 的一个方法,可以在没有调用 django.setup() 的情况下导入模型。

from django.apps import apps

Model = apps.get_model('app_label', 'model_name')
  • 取第一个参数 app_label 是应用的标签
  • 第二个参数 model_name 是模型的名称
    这个方法会直接从 Django 的注册表中获取模型类,而不会进行任何初始化。
    使用 apps.get_model() 的好处是:
  • 避免重复调用 django.setup()
  • 解决循环导入错误
  • 在 Django 初始化之前也可以导入模型
    总的来说:
    通过 apps.get_model() ,可以在无需调用 django.setup() 的情况下,安全地导入 Django 模型。
    它通过直接从注册表获取模型类,解决了导入模型前需要初始化的问题。

独立进程使用django模型报错:Apps aren’t loaded yet

问题描述:
独立进程使用django模型,导入模型的时候报错:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

问题原因:
出现这个问题的原因可能有如下情况:

  1. 你根本没有调django.setup()
  2. 你调django.setup()的位置不对,在加载模型之前了。(应该放在独立进程最前面)
  3. 【隐藏的比较深】你调django.setup()时,应用名xxx和和某个文件名xxx.py重名了,而这个xxx.py中又用了django模型,但是这个模型对应的django应用还没执行到。

3个问题的本质都是django.setup() 没有执行完,就使用模型。

我们重点描述一下情况3:

django.setup() 会循环调传入你settings.py配置的应用名来调
django源码路径\django\apps\config.py 下的create方法,如下:

@classmethod
def create(cls, entry):
    """
    Factory that creates an app config from an entry in INSTALLED_APPS.
    """
    # create() eventually returns app_config_class(app_name, app_module).
    app_config_class = None
    app_name = None
    app_module = None

    # If import_module succeeds, entry points to the app module.
    try:
        app_module = import_module(entry)
    except Exception:
        pass
    else:
        # If app_module has an apps submodule that defines a single
        # AppConfig subclass, use it automatically.
        # To prevent this, an AppConfig subclass can declare a class
        # variable default = False.
        # If the apps module defines more than one AppConfig subclass,
        # the default one can declare default = True.
  • entry 参数就是你应用名,比如三方的应用名叫:‘django.contrib.auth’,我们自己的应用名xxx。

import_module()存在一个限制就是:

  • 如果同时存在一个.py文件和一个包(包含__init__.py)具有相同的名称
  • 那么import_module()会优先导入.py文件

问题就出现在这里了,所以我们应用命名时候,注意这种情况- -!文章来源地址https://www.toymoban.com/news/detail-537774.html

到了这里,关于独立进程使用django模型(django.setup()使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 10分钟快速上手LLM大模型Python前端开发(三)之显示模块(一)

    微信公众号:leetcode_algos_life,代码随想随记 小红书:412408155 CSDN:https://blog.csdn.net/woai8339?type=blog GitHub: https://github.com/riverind 抖音【暂未开始,计划开始】:tian72530 知乎【暂未开始,计划开始】:happy001 本系列主要应用于大模型前端展示,十分钟快速上手前端系列。 该文章

    2024年01月16日
    浏览(40)
  • 使用 Docker 快速上手官方版 LLaMA2 开源大模型

    本篇文章,我们聊聊如何使用 Docker 容器快速上手 Meta AI 出品的 LLaMA2 开源大模型。 昨天特别忙,早晨申请完 LLaMA2 模型下载权限后,直到晚上才顾上折腾了一个 Docker 容器运行方案,都没来得及写文章来聊聊这个容器怎么回事,以及怎么使用。 所以,现在就来聊聊如何快速上

    2024年02月16日
    浏览(37)
  • 使用 Docker 快速上手中文版 LLaMA2 开源大模型

    本篇文章,我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型,国内第一个真正开源,可以运行、下载、私有部署,并且支持商业使用。 感慨于昨天 Meta LLaMA2 模型开放下载之后,GitHub 上出现了许多“只有 Readme 文档” 的开源模型项目,并一时间在

    2024年02月16日
    浏览(48)
  • 快速上手Django(七) -Django之登录cookie和session

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 cookie Cookie原理、Set-Cookie常用字段、应用 参考URL: https://blog.csdn.net/jiangshangc

    2023年04月20日
    浏览(60)
  • 【信号】信号处理与进程通信:快速上手

    目录 0. 信号概述 1. 产生信号的方式: 1.1 当用户按某些终端键时,将产生信号。 1.2 硬件异常将产生信号。 1.3 软件异常将产生信号。 1.4 调用kill函数将发送信号。 1.5 运行kill命令将发送信号。 2. 信号的默认(缺省)处理方式 2.1 终止进程: 2.2 缺省出来: 2.3 停止进程: 2.

    2024年02月12日
    浏览(40)
  • 快速上手Django(九) -Django下载文件、Django上传文件、Django实现excel导入导出

    在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载。 1. Django下载文件方案和思路 将文件作为响应返回给用户:这是最常用的下载文件方法。你可以编写一个视图函数,在该函数中将文件作为响应返回给用户。 使用第三方库,如您需要支持断点续传或并发

    2024年02月05日
    浏览(52)
  • 使用 Docker 和 Diffusers 快速上手 Stable Video Diffusion 图生视频大模型

    本篇文章聊聊,如何快速上手 Stable Video Diffusion (SVD) 图生视频大模型。 月底计划在机器之心的“AI技术论坛”做关于使用开源模型 “Stable Diffusion 模型” 做有趣视频的实战分享。 因为会议分享时间有限,和之前一样,比较简单的部分,就用博客文章的形式来做补充分享吧。

    2024年01月24日
    浏览(71)
  • 快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy(flask SQLAlchemy模型对象如何json序列化输出)

    常见情况下对于只有一个 Flask 应用,所有您需要做的事情就是创建 Flask 应用,选择加载配置接着创建 SQLAlchemy 对象时候把 Flask 应用传递给它作为参数。 官网:https://www.sqlalchemy.org/ 参考本人 文章:python常用库之数据库orm框架之SQLAlchemy 官方文档: 中文: http://www.pythondoc.co

    2024年01月25日
    浏览(53)
  • 使用Python进行网站页面开发——Django快速入门

    目录 一、项目的创建与运行 1.创建项目 2.运行  二、应用的创建和使用 1,创建一个应用程序 2.编写我们的第一个视图  三、项目的模型 1.连接MySQL数据库设置 2.创建模型 3.激活模型  4.使用(两种) (1)现在进入交互式的Python shell,并使用Django提供的免费API (2)在myapp应用的

    2023年04月08日
    浏览(48)
  • UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等

    所有的文本类,无论变量还是控件等都能实现本地化,以此实现不同语言版本。 在这里先将重点注意标注一下: 所有文本类的变量、控件等都可以多语言; 本地化控制板中收集、编译时,别忘了编译这一步; 支持批量复制和粘贴文本字段 测试时必须要独立进程才能起效,

    2024年04月27日
    浏览(114)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包