【发布时间】:2019-11-09 15:33:02
【问题描述】:
我想在外部 python 脚本中使用 Django 模型。这个 python 脚本放置在我项目的根目录中,我还创建了一个 init.py 模块以便于导入。任何人都可以指导将 Django 模型导入 python 脚本的最安全和最有效的方法吗?
如果有人能告诉我将 init.py 模块放在根目录中是否准确,我将不胜感激。如果没有,最好的方法是什么?
【问题讨论】:
我想在外部 python 脚本中使用 Django 模型。这个 python 脚本放置在我项目的根目录中,我还创建了一个 init.py 模块以便于导入。任何人都可以指导将 Django 模型导入 python 脚本的最安全和最有效的方法吗?
如果有人能告诉我将 init.py 模块放在根目录中是否准确,我将不胜感激。如果没有,最好的方法是什么?
【问题讨论】:
仅当您希望脚本独立(您希望在服务器未运行时访问模型)时才使用此解决方案
基本上有两种不同的方法可以做到这一点:
如果您要经常运行此代码,我强烈建议您为该代码创建一个管理命令。 (查看说明here)
但如果它是批量数据导入或不会多次运行的东西,您可以使用类似的东西(将它放在 django 应用程序的根目录中 - 在 manage.py 旁边):
import os
import django
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_project_name>.settings")
django.setup()
# now you have access to your models
# as an example:
# from users.models import User
#
# for user in User.objects.all():
# print(user)
还请记住,您应该始终在 django.setup() 之后导入模型,否则会出错。
如果有人能告诉我将 init.py 模块放在根目录中是否准确,我将不胜感激。如果没有,最好的方法是什么?
如果你想拥有多个脚本文件,把它们放在django项目的根目录下不是一个好主意。你可以在manage.py旁边创建一个python包,比如my_scripts,然后把你的脚本放在那里。
所以你最终会得到这样的结果:
...
manage.py
my_scripts
├── __init__.py
└── first_script.py
但是现在您需要对脚本文件进行一些更改以使其正常工作。您应该追加 BASE_DIR 到您的路径,以便 python 可以识别 settings 文件(或模块,如果您扩展它):
import os
import sys
import django
if __name__ == '__main__':
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_project_name>.settings")
django.setup()
# now you have access to your models
# as an example:
# from users.models import User
#
# for user in User.objects.all():
# print(user)
【讨论】:
utilities.py,在您想要的应用程序旁边,您通常可以从那里导入 任何 模型。我以为你希望你的脚本是独立的(这样即使服务器没有运行你也可以运行它们)。见this
manage.py 旁边。