獨(dú)立進(jìn)程使用django模型及django.setup()使用
獨(dú)立進(jìn)程使用django模型
通過(guò)在獨(dú)立進(jìn)程中使用 Django 模型,你可以充分利用 Django 框架提供的數(shù)據(jù)庫(kù)訪問(wèn)和模型層功能,更方便地進(jìn)行數(shù)據(jù)處理、任務(wù)處理和與其他系統(tǒng)的集成。它提供了一種簡(jiǎn)單且高效的方式來(lái)利用 Django 強(qiáng)大的功能,并使你的代碼更易于維護(hù)和擴(kuò)展。
獨(dú)立進(jìn)程使用django模型 步驟
1.在獨(dú)立進(jìn)程的代碼文件開(kāi)頭,需要設(shè)置 Django 的環(huán)境變量,以使其能夠正確加載和使用 Django 框架。添加以下代碼:
import os import django # 設(shè)置 DJANGO_SETTINGS_MODULE 環(huán)境變量(引入settings文件) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') # 加載 Django 項(xiàng)目配置 django.setup()
2.在獨(dú)立進(jìn)程中導(dǎo)入需要使用的 Django 模型,可以直接使用 from your_app.models import YourModel 這樣的導(dǎo)入語(yǔ)句來(lái)引入需要的模型類(lèi)。
注意:在獨(dú)立進(jìn)程中使用 Django 模型需要確保你的 Django 項(xiàng)目已正確配置并且數(shù)據(jù)庫(kù)連接可用。同時(shí),你在獨(dú)立進(jìn)程中的代碼修改不會(huì)自動(dòng)觸發(fā) Django 的信號(hào)和中間件,因此需要手動(dòng)處理相關(guān)邏輯。
django.setup()
django.setup() 是 Django 中的一個(gè)函數(shù),主要用于設(shè)置 Django 的環(huán)境和配置。它需要在使用 Django 模型之前調(diào)用,以確保 Django 的各項(xiàng)功能能夠正常工作。
第一個(gè)過(guò)程是從INSTALLED_APP中導(dǎo)入每一個(gè)內(nèi)容,這個(gè)過(guò)程中代碼不應(yīng)該導(dǎo)入任何models,即使是間接的導(dǎo)入。
第二個(gè)過(guò)程Django嘗試導(dǎo)入models中的子模塊,并且必須通過(guò)models.py和models/init.py。
第三個(gè)過(guò)程是調(diào)用每個(gè)application的ready()方法。
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings' django.setup()
DJANGO_SETTINGS_MODULE
環(huán)境變量已告知Django使用哪個(gè)settings.py
文件。Django會(huì)自動(dòng)根據(jù)這個(gè)settings.py
文件,加載其中的INSTALLED_APPS
配置,完成必要的應(yīng)用初始化。
RuntimeError: populate() isn’t reentrant
獨(dú)立進(jìn)程的入口調(diào)用了django.setup()
,但是獨(dú)立進(jìn)程在import其他 模塊.py文件,其他py文件中又import了其他django模型。但是在這個(gè)引入的py中你又不能再調(diào) django.setup()
,因?yàn)檫@個(gè)東西只能調(diào)一次。
解決思路:通過(guò)apps.get_model()
來(lái)導(dǎo)入模型,避免重復(fù)調(diào)用django.setup()
。
apps.get_model() 是 Django 的一個(gè)方法,可以在沒(méi)有調(diào)用 django.setup() 的情況下導(dǎo)入模型。
from django.apps import apps Model = apps.get_model('app_label', 'model_name')
- 取第一個(gè)參數(shù) app_label 是應(yīng)用的標(biāo)簽
- 第二個(gè)參數(shù) model_name 是模型的名稱(chēng)
- 這個(gè)方法會(huì)直接從 Django 的注冊(cè)表中獲取模型類(lèi),而不會(huì)進(jìn)行任何初始化。
- 使用 apps.get_model() 的好處是:
- 避免重復(fù)調(diào)用 django.setup()
- 解決循環(huán)導(dǎo)入錯(cuò)誤
- 在 Django 初始化之前也可以導(dǎo)入模型
總的來(lái)說(shuō):
通過(guò) apps.get_model() ,可以在無(wú)需調(diào)用 django.setup() 的情況下,安全地導(dǎo)入 Django 模型。
它通過(guò)直接從注冊(cè)表獲取模型類(lèi),解決了導(dǎo)入模型前需要初始化的問(wèn)題。 獨(dú)立進(jìn)程使用django模型報(bào)錯(cuò):Apps aren’t loaded yet
問(wèn)題描述:獨(dú)立進(jìn)程使用django模型,導(dǎo)入模型的時(shí)候報(bào)錯(cuò):django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
問(wèn)題原因:出現(xiàn)這個(gè)問(wèn)題的原因可能有如下情況:
- 你根本沒(méi)有調(diào)
django.setup()
- 你調(diào)
django.setup()
的位置不對(duì),在加載模型之前了。(應(yīng)該放在獨(dú)立進(jìn)程最前面) - 【隱藏的比較深】你調(diào)
django.setup()
時(shí),應(yīng)用名xxx和和某個(gè)文件名xxx.py重名了,而這個(gè)xxx.py中又用了django模型,但是這個(gè)模型對(duì)應(yīng)的django應(yīng)用還沒(méi)執(zhí)行到。
3個(gè)問(wèn)題的本質(zhì)都是django.setup() 沒(méi)有執(zhí)行完,就使用模型。
我們重點(diǎn)描述一下情況3:
調(diào)django.setup()
會(huì)循環(huán)調(diào)傳入你settings.py
配置的應(yīng)用名來(lái)調(diào)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 參數(shù)就是你應(yīng)用名,比如三方的應(yīng)用名叫:‘django.contrib.auth’,我們自己的應(yīng)用名xxx。
import_module()存在一個(gè)限制就是:
- 如果同時(shí)存在一個(gè)
.py
文件和一個(gè)包(包含__init__.py
)具有相同的名稱(chēng) - 那么
import_module()
會(huì)優(yōu)先導(dǎo)入.py
文件
問(wèn)題就出現(xiàn)在這里了,所以我們應(yīng)用命名時(shí)候,注意這種情況- -!
到此這篇關(guān)于獨(dú)立進(jìn)程使用django模型(django.setup()使用)的文章就介紹到這了,更多相關(guān)django.setup()使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)例講解Python爬取網(wǎng)頁(yè)數(shù)據(jù)
這篇文章給大家通過(guò)實(shí)例講解了Python爬取網(wǎng)頁(yè)數(shù)據(jù)的步驟以及操作過(guò)程,有興趣的朋友跟著學(xué)習(xí)下吧。2018-07-07Python使用ctypes調(diào)用C/C++的方法
今天小編就為大家分享一篇關(guān)于Python使用ctypes調(diào)用C/C++的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(2)
這篇文章主要為大家詳細(xì)介紹了Python中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Python獲取接口請(qǐng)求耗時(shí)的方法詳解
你想知道我們請(qǐng)求一個(gè)url的時(shí)候,握手和請(qǐng)求資源分別占用多長(zhǎng)時(shí)間么?今天我們就來(lái)使用python寫(xiě)個(gè)小案例來(lái)看看,感興趣的可以跟隨小編一起了解一下2023-04-04采用Psyco實(shí)現(xiàn)python執(zhí)行速度提高到與編譯語(yǔ)言一樣的水平
這篇文章主要介紹了采用Psyco實(shí)現(xiàn)python執(zhí)行速度提高到與編譯語(yǔ)言一樣的水平的方法,是非常實(shí)用的Python第三方庫(kù),需要的朋友可以參考下2014-10-10Python使用VIF實(shí)現(xiàn)檢測(cè)多重共線性
多重共線性是指多元回歸模型中有兩個(gè)或兩個(gè)以上的自變量,它們之間具有高度的相關(guān)性,本文主要介紹了如何使用VIF實(shí)現(xiàn)檢測(cè)多重共線性,需要的可以參考下2023-12-12Python創(chuàng)建Excel的4種方式小結(jié)
這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建Excel的4種常見(jiàn)方式,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2025-02-02