Django + shell_plus + Jupyter notebooks made easy
A Jupyter notebook with access to objects from the Django ORM is a powerful tool to introspect data and run ad-hoc queries.
Full documentation available at dj-notebook
The ever-growing list of features:
- Easy Jupyter notebooks with Django
- Built-in integration with the imported objects from django-extensions
shell_plus
- Saves the state between sessions so you don't need to remember what you did
- Inheritance diagrams on any object, including ORM models
- Converts any Django QuerySet to Pandas Dataframe
- Handy function for displaying MermaidJS charts
- Generates visual maps of model relations
- Works in the browser, VSCode, PyCharm, Emacs, Vim, and more!
Use your installation tool of choice, here we use venv and pip:
python -m venv venv
source venv/bin/activate
pip install dj_notebook
First, find your project's manage.py
file and open it. Copy whatever is being set to DJANGO_SETTINGS_MODULE
into your clipboard.
Create an ipython notebook in the same directory as manage.py
, or another directory of your choosing. In VSCode,
simply add a new .ipynb
file. If using Jupyter Lab, use the File -> New -> Notebook
menu option.
Then in the first cell enter:
from dj_notebook import activate
plus = activate()
# If you have created your notebook in a different directory, instead do:
# plus = activate(search_dir="/path/to/your/project")
# If that throws an error, try one of the following:
# DJANGO_SETTINGS_MODULE_VALUE aka "book_store.settings"
# plus = activate("DJANGO_SETTINGS_MODULE_VALUE")
# Point to location of dotenv file with Django settings
# plus = activate(dotenv_file='.env')
In future cells, you can now load and run Django objects, including the ORM. This three line snippet should give an idea of what you can now do:
from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.all()
But wait, it gets better!
When you activated the Django environment, you instantiated a variable called 'plus'. The 'plus' variable is an object that contains everything loaded from django-extensions' shell_plus
. Here's a demonstration, try running this snippet:
plus.User.objects.all()
We also provide a utility for introspection of classes, which can be useful in sophisticated project architectures. Running this code in a Jupyter notebook shell:
plus.diagram(plus.User)
Generates this image
Here's another useful diagram:
plus.model_graph(plus.User)
Want to convert a Django query to a Pandas Dataframe? We got you covered.
plus.read_frame(plus.User.objects.all())
dj-notebook official documentation
Daniel Roy Greenfeld |
Cody Antunez |
Geoff Beier |
Nick Powell |
Saransh Sood |
Anna Zhydko |
Tejo Kaushal |
Simon Davy |
Null |
Dave Parr |
Siew-Yit Yong |
These are people who aren't in our formal git history but should be.
- Tom Preston did seminal work on Python paths that later became the foundation of dj-notebook
- Evie Clutton was co-author of a pull request and they don't show up in the contributor list above
- Tim Schilling assisted with the
model_graph
method - Charlie Denton is responsible for django-schema-graph, which we leverage as part of the
model_graph
feature - Christopher Clarke built
django-pandas
, which dj-notebook uses - Stephen Moore for some early work done on the internals of dj-notebook before it was open sourced.
- django-extensions for providing so many useful tools over the years, and being one of the backbones of this project
Tom Preston |
Null |
Tim Schilling |
Charlie Denton |
Christopher Clarke |
Stephen Moore |
Django Extensions |
This package was created with Cookiecutter and the simplicity project template.