我正在尝试从另一个python脚本访问我的Django(v1.10)应用程序数据库,并且遇到了一些麻烦。
这是我的文件和文件夹结构:
store
store
__init.py__
settings.py
urls.py
wsgi.py
store_app
__init.py__
admin.py
apps.py
models.py
...
db.sqlite3
manage.py
other_script.py
根据Django's documentations我的other_script.py
看起来像这样:
import django
from django.conf import settings
settings.configure(DEBUG=True)
django.setup()
from store.store_app.models import MyModel
但它会产生运行时错误:
RunTimeError: Model class store.store_app.models.MyModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
我应该注意,我的INSTALLED_APPS
列表包含store_app
作为其最后一个元素。
如果我尝试传递这样的配置:
import django
from django.conf import settings
from store.store_app.apps import StoreAppConfig
settings.configure(StoreAppConfig, DEBUG=True)
django.setup()
from store.store_app.models import MyModel
我明白了:
AttributeError: type object 'StoreAppConfig has no attribute 'LOGGING_CONFIG'.
如果我修改settings.py
并添加LOGGING_CONFIG=None
,我会收到另一个有关其他遗失属性的错误,依此类推。
任何建议将不胜感激。
答案 0 :(得分:32)
试试这个
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
Text:
<input id="input" type="text" value="John Doe">
</body>
</html>
您可以在系统中的任何位置使用此脚本。
答案 1 :(得分:9)
这听起来像Django Management commands.的一个很好的用例,它有额外的好处,你可以从cron运行它,直接从命令行运行,或从django内部调用。这使脚本可以完全访问与主项目相同的设置和环境变量。
如果将其移动到适当的目录中 - 使用此处的商店作为示例,而不是建议,它应该有效。
store
management
__init__.py
commands
__init__.py
otherscript.py
答案 2 :(得分:1)
我发现django-extensions
软件包最有用。您可以找到它here
安装并将其添加到已安装的应用程序之后,您要做的就是创建一个名为scripts
的目录,创建一个文件并由python manage.py runscript file_name
运行它
请记住,文件必须具有入口点。该入口点是一种称为run
的方法,必须在终端中运行python manage.py runscript file_name
时才能运行
答案 3 :(得分:0)
尝试从store_app.models
导入 - 因为周围的store
文件夹不是python模块,导入时不应使用。
import django
from django.conf import settings
settings.configure(DEBUG=True)
django.setup()
from store_app.models import MyModel
更新:我刚刚注意到你把那个脚本放在你的项目文件夹旁边 - 你应该把它移到里面才能工作。
答案 4 :(得分:0)
Django 独立脚本。
import os
PROJECT_NAME = 'ENTER YOUR PROJECT NAME HERE'
def main():
# import statemts
# from app.models import Author,Category,Book
# code logic - anything you want
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % PROJECT_NAME)
import django
django.setup()
main()