簡體   English   中英

使用`settings / dev.py`而不是`settings.py`運行在Django中執行模型查詢的獨立腳本

[英]Running a standalone script doing a model query in Django with `settings/dev.py` instead of `settings.py`

請注意以下Django(1.4.3)項目中的settings/dev.py而不是一個settings.py文件和my_app中的script.py

.
├── 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文件夾時,我能夠運行以下腳本而沒有任何錯誤

script.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()

順便說一句,我得到了在第二種方法這篇文章中 ,我的設置是幾線長,因為我script.py是在my_app文件夾,而不是直屬my_project文件夾。

因為我現在使用settings/dev.py instead settings.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而不是settings.py在Django中運行我的腳本?

如果你想在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)

這些文檔非常有助於解釋這一點。

但是,您可以指定要使用的設置文件

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

然而,這將使用dev中的設置運行測試服務器,我擔心你的問題比簡單的問題更深入。 我不建議更改manage.py文件,因為這可能導致不一致和未來的麻煩。

另請注意,如果要執行此操作, 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

因為這將為您設置所有OS環境變量settings.py ,然后您可以測試/調試

>>> from my_app.models import MyModel
>>> all_entries = MyModel.objects.all()
>>> for entry in all_entries:
...   print entry    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM