【问题标题】:How to use Django model in an external python script within the project?如何在项目的外部 python 脚本中使用 Django 模型?
【发布时间】:2019-11-09 15:33:02
【问题描述】:

我想在外部 python 脚本中使用 Django 模型。这个 python 脚本放置在我项目的根目录中,我还创建了一个 init.py 模块以便于导入。任何人都可以指导将 Django 模型导入 python 脚本的最安全和最有效的方法吗?

如果有人能告诉我将 init.py 模块放在根目录中是否准确,我将不胜感激。如果没有,最好的方法是什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

    仅当您希望脚本独立(您希望在服务器运行时访问模型)时才使用此解决方案

    基本上有两种不同的方法可以做到这一点:

    1. 如果您要经常运行此代码,我强烈建议您为该代码创建一个管理命令。 (查看说明here

    2. 但如果它是批量数据导入或不会多次运行的东西,您可以使用类似的东西(将它放在 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)
    

    【讨论】:

    • 关于第一个选项,我希望在我的模板中单击一个使用 AJAX 的按钮后,在我的 views.py 模块中调用外部 python 脚本作为一个函数。如果我给它一个管理命令,这个过程会不会不那么动态?我正在寻找一种动态方式,让我调用在我的项目中使用 Django 模型的 python 脚本。这是我的想法,但在您看来,可以为此使用管理命令吗?
    • 如果你想在 django 运行时使用这些脚本,那么你不需要这些解决方案。您可以简单地创建 python 文件,例如 utilities.py,在您想要的应用程序旁边,您通常可以从那里导入 任何 模型。我以为你希望你的脚本是独立的(这样即使服务器没有运行你也可以运行它们)。见this
    • 哦,是的,这就是我要找的。该脚本应该出现在 manage.py 旁边,对吗?除了脚本,我还在一个文件夹中找到了几个其他的 python 模块。我可以将它们放在我的项目的根目录中吗?
    • 是的,就是这样。您可以将脚本本身放在您的 apps 目录之一中,如果它仅与一个特定应用程序相关,或者如您所说,将其放在 manage.py 旁边。
    • 这很酷。谢谢你的时间。所以,再次澄清一下,我不需要遵循上述步骤,对吧? (因为我希望在服务器运行时运行脚本......)
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2015-11-12
    • 2019-05-31
    • 2019-07-08
    • 1970-01-01
    • 2019-05-16
    • 2022-11-30
    相关资源
    最近更新 更多