python - 使用 `settings/dev.py` 而不是 `settings.py` 运行独立脚本在 Django 中执行模型查询

标签 python django django-settings

注意 settings/dev.py而不是一个 settings.py文件和 script.pymy_app在以下 Django(1.4.3) 项目中:

.
├── my_project
│   ├── my_app
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── views.py
│   │   └── script.py
│   ├── __init__.py
│   ├── settings
│   │   ├── dev.py
│   │   ├── __init__.py
│   │   └── prod.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── requirements.txt

当我只有一个settings.py文件代替 settings 文件夹我能够运行以下脚本而没有任何错误:

脚本.py:

###################################################################
# set up for making it possible to run a model query from my script. 
###################################################################
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
from django.core.management import setup_environ
import settings
setup_environ(settings)
####################################################################  
from my_app.models import MyModel

all_entries = MyModel.objects.all()

顺便说一句,我是从 this article 中的第二种方法得到的,我的设置长了几行,因为我的 script.pymy_app文件夹而不是直接位于 my_project 下文件夹。

因为我现在正在使用settings/dev.py insteadsettings.py我将脚本中设置的最后两行更改为以下内容:

import settings.dev
import setup_environ(settings.dev)

但是当我现在运行我的脚本时,我得到了这个错误:

Traceback (most recent call last):
  File "my_script.py", line 12, in <module>
    all_entries = MyModel.objects.all()
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/query.py", line 358, in get
    clone = self.filter(*args, **kwargs)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/query.py", line 624, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/query.py", line 642, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1250, in add_q
    can_reuse=used_aliases, force_having=force_having)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1122, in add_filter
    process_extras=process_extras)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1304, in setup_joins
    field, model, direct, m2m = opts.get_field_by_name(name)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/options.py", line 311, in get_field_by_name
    cache = self.init_name_map()
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/options.py", line 341, in init_name_map
    for f, model in self.get_all_related_m2m_objects_with_model():
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/options.py", line 429, in get_all_related_m2m_objects_with_model
    cache = self._fill_related_many_to_many_cache()
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/options.py", line 443, in _fill_related_many_to_many_cache
    for klass in get_models(only_installed=False):
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/loading.py", line 181, in get_models
    self._populate()
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/loading.py", line 64, in _populate
    self.load_app(app_name, True)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/db/models/loading.py", line 86, in load_app
    app_module = import_module(app_name)
  File "/home/my_username/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named my_project.my_app

为什么会出现这个错误? 如何使用 settings/dev.py 在 Django 中运行我的脚本而不是 settings.py ?

最佳答案

如果您只想在 django 环境中运行脚本,那么实现此目的的最简单方法是创建一个 ./manage.py 子命令,如下所示

from django.core.management.base import BaseCommand
from my_app.models import MyModel

class Command(BaseCommand):
    help = 'runs your code in the django environment'

    def handle(self, *args, **options):
        all_entries = MyModel.objects.all()
        for entry in all_entries:
            self.stdout.write('entry "%s"' % entry)

docs对解释这一点很有帮助。

但是,您可以指定要运行的设置文件

$ django-admin.py runserver --settings=settings.dev

这将使用 dev 中的设置运行测试服务器,但是,我担心您的问题比简单的问题更根深蒂固。我不建议更改 manage.py 文件,因为这会导致不一致和 future 的麻烦。

另请注意,如果要执行此操作,dev.py 应该是一个完整的设置文件。我个人会推荐这样的结构:

|-settings
|    |- __init__.py
|    |- base.py
|    |- dev.py
|    |- prod.py

并将所有常规设置保留在 base.py 中,并将 dev.py 等的第一行更改为类似

# settings/dev.py
from .base import *

DEBUG = True
...

编辑

如果你只是想测试一下,为什么不试试

$ ./manage.py shell

或者你的开发设置

$ django-admin.py shell --settings=settings.dev

因为这将为您设置所有操作系统环境变量,settings.py,然后您可以使用

进行测试/调试
>>> from my_app.models import MyModel
>>> all_entries = MyModel.objects.all()
>>> for entry in all_entries:
...   print entry    

关于python - 使用 `settings/dev.py` 而不是 `settings.py` 运行独立脚本在 Django 中执行模型查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603458/

相关文章:

python - Django 开发服务器一直注销

python - Matplotlib 中 X 轴中的换行符导致不希望的窗口大小调整/跳跃/闪烁行为

GAE 上的 Django : use_library vs Django-nonrel

python - 如何从 django.utils.safestring.SafeText 获取字符串

python - 命令错误 : You appear not to have the 'psql' program installed or on your path

Django:如何告诉 Django 应该在哪里寻找应用程序?

python - 在新的 GAE/Python/webapp2 网站中重定向旧网站 URL

python - Django 2.2 无法连接到 AWS ElasticBeanstalk 上的 ElastiCache Redis

python - 如何在 TensorFlow 中使用我自己的数据将图像拆分为测试集和训练集

django - 我如何为 huey 计划任务编写测试?