Django Standalone Script
I am trying to access my Django (v1.10) app DB from another python script and having some trouble doing so.
This is my file and folder structure:
store
store
__init.py__
settings.py
urls.py
wsgi.py
store_app
__init.py__
admin.py
apps.py
models.py
...
db.sqlite3
manage.py
other_script.py
In accordance with Django's documentations my other_script.py
looks like this:
import django
from django.conf import settings
settings.configure(DEBUG=True)
django.setup()
from store.store_app.models import MyModel
But it generates a runtime error:
RunTimeError: Model class store.store_app.models.MyModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
I should note that my INSTALLED_APPS
list contains store_app
as its last element.
If instead I try to pass a config like this:
import django
from django.conf import settings
from store.store_app.apps import StoreAppConfig
settings.configure(StoreAppConfig, DEBUG=True)
django.setup()
from store.store_app.models import MyModel
I get:
AttributeError: type object 'StoreAppConfig has no attribute 'LOGGING_CONFIG'.
If I edit settings.py
and add LOGGING_CONFIG=None
I get another error about another missing attribute, and so on.
Any suggestions will be appreciated.
Try this
import sys, os, django
sys.path.append("/path/to/store") #here store is root folder(means parent).
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "store.settings")
django.setup()
from store_app.models import MyModel
This script you can use anywhere in your system.
This sounds like a great use case for Django Management commands. which has the added bonus you can run it scheduled from cron, direct from the commandline, or call from inside django. This gives the script full access to the same settings and environment variables as your main project.
If you move this into an appropriate directory - using store here as an example, not a suggestion, it should work.
store
management
__init__.py
commands
__init__.py
otherscript.py
I found the django-extensions
package to be most useful. You can find it here
After installation and adding it to the installed apps, all you need to do is to create a directory called scripts
, create a file and run it by python manage.py runscript file_name
Just remember that the file must have an entry point. That entry point is a method called run
which has to be present and will run once you run python manage.py runscript file_name
in the terminal
try to import from store_app.models
- as the surrounding store
folder is not a python module and should not be used when importing.
import django
from django.conf import settings
settings.configure(DEBUG=True)
django.setup()
from store_app.models import MyModel
update: i just noticed that you put that script next to your project folder - you should move it inside for this to work.