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

 更新时间:2023年07月06日 10:23:27   作者:西京刀客  
这篇文章主要介绍了独立进程使用django模型(django.setup()使用),它提供了一种简单且高效的方式来利用Django强大的功能,并使你的代码更易于维护和扩展,需要的朋友可以参考下

独立进程使用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()

2.在独立进程中导入需要使用的 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.

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

  • 你根本没有调django.setup()
  • 你调django.setup()的位置不对,在加载模型之前了。(应该放在独立进程最前面)
  • 【隐藏的比较深】你调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文件

问题就出现在这里了,所以我们应用命名时候,注意这种情况- -!

到此这篇关于独立进程使用django模型(django.setup()使用)的文章就介绍到这了,更多相关django.setup()使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pyinstaller 打包发布经验总结

    Pyinstaller 打包发布经验总结

    这篇文章主要介绍了Pyinstaller 打包发布经验总结,使用Pyinstaller打包Python项目包含了大量的坑,感兴趣的可以一起来了解一下
    2020-06-06
  • 浅析Python的对象拷贝和内存布局

    浅析Python的对象拷贝和内存布局

    这篇文章主要为大家详细介绍了Python中的对象拷贝和内存布局的相关知识,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
    2022-12-12
  • 解读NumPy数组与Python列表的比较

    解读NumPy数组与Python列表的比较

    在Python中处理数值数据时,可以选择使用Python列表或NumPy数组,Python列表灵活,可存储不同类型元素,但在大数据处理上可能较慢,NumPy数组固定类型,内存连续存储,执行数组操作如加法、乘法等更高效,尤其在大数据集处理上具有明显的性能和内存使用优势
    2024-10-10
  • Python的Django框架中的数据过滤功能

    Python的Django框架中的数据过滤功能

    这篇文章主要介绍了Python的Django框架中的数据过滤功能,为更新数据库数据时的数据查找提供了方便,需要的朋友可以参考下
    2015-07-07
  • Python Matplotlib 库使用指南

    Python Matplotlib 库使用指南

    这篇文章主要介绍了Python Matplotlib 库使用基本指南,通过本教程,我们学习了使用 Matplotlib 创建各种类型的图表和图形,Matplotlib 提供了丰富的函数和选项,以满足不同的数据可视化需求,需要的朋友可以参考下
    2024-01-01
  • 使用Python删除Excel单元格公式并保留数值

    使用Python删除Excel单元格公式并保留数值

    在日常业务中,我们经常会遇到含有大量公式的 Excel 文件,例如财务报表、销售数据分析表、项目预算表等,这些公式在计算时非常有用,但有时我们希望将公式去掉,只保留最终的计算结果,本文将介绍如何使用Python自动完成这一过程,需要的朋友可以参考下
    2025-11-11
  • OpenCV半小时掌握基本操作之图像金字塔

    OpenCV半小时掌握基本操作之图像金字塔

    这篇文章主要介绍了OpenCV基本操作之图像金字塔,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 基于pygame实现童年掌机打砖块游戏

    基于pygame实现童年掌机打砖块游戏

    这篇文章主要为大家详细介绍了基于pygame实现童年掌机打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • python中remove函数的踩坑记录

    python中remove函数的踩坑记录

    这篇文章主要给大家介绍了关于python中remove函数的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python中join与os.path.join()函数实例详解

    python中join与os.path.join()函数实例详解

    os.path.join()函数用于路径拼接文件路径,下面这篇文章主要给大家介绍了关于python中join与os.path.join()函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03

最新评论