Note the settings/dev.py
instead of one settings.py
file and the script.py
in my_app
in the following Django(1.4.3) project:
.
├── 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
When I only had one settings.py
file in place of the settings folder I was able to run the following script without any errors:
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()
Btw, I got that from the second approach in this article, my setup is a few lines longer because my script.py
is in the my_app
folder instead of directly under the my_project
folder.
Because I am now using settings/dev.py instead
of settings.py
I changed the last two lines of my setup in my script to the following:
import settings.dev
import setup_environ(settings.dev)
But when I run my script now I get this error:
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
Why is this error occurring? How can I run my script in Django with settings/dev.py
instead of settings.py
?
If you're looking to just run a script in the django environment, then the simplest way to accomplish this is to create a
./manage.py
subcommand, like thisThe docs are quite helpful with explaining this.
However, you can specify a settings file to run with using
which will run the test server using the settings in
dev
however, I fear your problems are more deep seated than simply that. I wouldn't recommend ever changing themanage.py
file as this can lead to inconsistencies and future headaches.Note also that
dev.py
should be a complete settings file if you are to do this. I would personally recommend a structure like this:and keep all the general settings in your
base.py
and change the first line of yourdev.py
etc to something likeEDIT
If you're just looking to test things out, why not try
or with your dev settings
as this will set all the OS environment variables,
settings.py
for you, and then you can test / debug with