【问题标题】:Import django models to custom python script将 django 模型导入自定义 python 脚本
【发布时间】:2021-07-14 16:20:33
【问题描述】:

我正在尝试在我的 Django 应用程序中创建自定义 python 脚本。此脚本需要使用我的应用模型。我无法弄清楚如何正确导入模型以在此脚本中使用。

My project directory:
-my_proj(name:ais)
-my_app(name:pages)
  -__init__.py
  -models.py
  -urls.py
   ...
  -utils
    -__init__.py
    -custom_script.py

如果我想从custom_script.py 访问 pages.models,我该怎么做呢?

我尝试了各种导入,例如 from django.core.management import settingsfrom django.core.wsgi import get_wsgi_application,但我仍然收到错误消息:

ModuleNotFoundError: No module named 'pages'

【问题讨论】:

标签: python django django-models import


【解决方案1】:

查看应用中所有模型的一种方法是从 django 应用中导入应用并使用 get_models 方法。

from django.apps import apps

然后您可以使用推导式来查看您的所有模型及其路径。一旦你看到你想要的路径,你就可以在你的脚本顶部导入它。

models = { model.__name__: model for model in apps.get_models() }

将模型输入到您的 shell 以查看应用中的模型列表以及从根目录开始的路径

您还要确保您的脚本中有导入设置

【讨论】:

    【解决方案2】:

    你可以写一个custom Command

    ma​​nagement/commands 目录添加到您的应用:

    my_app/
        __init__.py
        模型.py
        管理/
            __init__.py
            命令/
                __init__.py
                my_command.py
    

    然后您可以创建文件 my_app/management/commands/my_command.py,包含如下内容:

    from django.core.management.base import BaseCommand, CommandError
    from my_ap.models import MyModel
    
    class Command(BaseCommand):
        help = 'Command to update some field'
    
        def add_arguments(self, parser):
            parser.add_argument('ids', nargs='+', type=int)
    
        def handle(self, *args, **options):
            for cur_id in options['ids']:
                try:
                    obj = MyModel.objects.get(pk=my_id)
                except MyModel.DoesNotExist:
                    raise CommandError('MyModel "%s" does not exist' % my_id)
    
                obj.for_index = False
                obj.save()
    
                self.stdout.write(self.style.SUCCESS('Successfully closed "%s"' % my_id))
    

    【讨论】:

      【解决方案3】:

      我总是为此使用runscript,这是django-extensions 的一部分。它需要安装这个库,但它非常值得。然后,您可以在项目根目录中创建一个scripts/ 目录,这样您就可以使用所有模型了。

      简单

      pip install django-extensions
      

      然后按照步骤here

      【讨论】:

        【解决方案4】:

        Django 完成了许多应用程序配置,以使您的模型和设置正确可用。让 Django 进行此配置的最佳方法是使您的脚本成为管理命令,该命令将由 python manage.py <your_script_name> 运行。文档介绍了如何制作自己的管理命令。 https://docs.djangoproject.com/en/3.2/howto/custom-management-commands/

        【讨论】:

        • 此脚本的长期目标是报告。基本上,我最终会使用 jenkins 每周运行一次这个脚本,所以我不确定这是否适用于我的特定用例。
        • 我不明白为什么这对您的用例不起作用。 Jenkins 不能像运行 python <your script name> 一样轻松运行 python manage.py <your script name> 吗?
        • 你是对的,这完美无缺。非常感谢您的帮助!
        猜你喜欢
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 2017-11-02
        • 2018-07-31
        相关资源
        最近更新 更多