Unlock django super powers with Django Extensions

Unlock django super powers with Django Extensions

Django Extensions provides various features collection of custom extensions for the Django Framework. These include shell_plus, management commands, additional database fields, admin extensions e.t.c.

This article was originally posted at uchaudhary.com.np

Installation

As of now django-extension is of version 3.2.1. Install it with command:

pip3 install django-extensions

Configuration

Add the django_extensions package to the INSTALLED_APPS section of the settings.py file.:

INSTALLED_APPS = (
  ...
  'django_extensions',
)

This will make sure django-extensions is loaded when the app is started.

Features

Now let's look the features in detail. This extension consist of various management/shell commands.

1. Shell Plus

It is a enhanced version of django shell. It autoloads all the models to the shell. The following command can be used to fireup the shell_plus.

./manage.py shell_plus

We can configure Shell plus to use to use either ipython, bpython, ptpython or plain shell. In the settings.py add the following below:

# Always use IPython for shell_plus
SHELL_PLUS = "ipython"

Example Screenshot:

screen-shot-2022-10-02-at-18-03-26.png

Read more about the shell_plus from here.

2. Delete Squashed Migrations

Squashed migrations is a way to merge multiple migrations to single one. The below command squashes migrations of blog app from 0001 through 0008.

./manage.py squashmigrations blog 0001 0008

This will generate a new squashed migration. Here is how the file structure looks right now.

├── 0001_initial.py
├── 0001_initial_squashed_0008_blogcomment_parent.py
├── 0002_blog_markdown_body.py
├── 0003_alter_blog_markdown_body.py
├── 0004_blog_views.py
├── 0005_blog_table_of_content.py
├── 0006_remove_blog_body_remove_blog_table_of_content.py
├── 0007_bloglikes_blogcomment.py
├── 0008_blogcomment_parent.py

Then the following command clean ups the migrations that are no needed.

# Delete leftover migrations from the first squashed migration found in blog
./manage.py delete_squashed_migrations blog

After this the file structure will only contain the squashed file deleting other migrations.

0001_initial_squashed_0008_blogcomment_parent.py

3. Export emails

The following command exports the registered user emails to a file.

./manage.py export_emails > emails.txt

The emails.txt File will consists of something similar as below.

"admin" <admin@gmail.com>;
"anonymous@gmail.com" <anonymous@gmail.com>;
"anotherone@gmail.com" <anotherone@gmail.com>;
"commenter@gmail.com" <commenter@gmail.com>;
"comment@gmail.com" <comment@gmail.com>;
"commenting@gmail.com" <commenting@gmail.com>;
"email@gmail.com" <email@gmail.com>;
"gamerboy@gmail.com" <gamerboy@gmail.com>;
"gumail@gmail.com" <gumail@gmail.com>;
"mycomment@gmail.com" <mycomment@gmail.com>;
"myemail@gmail.com" <myemail@gmail.com>;
"python@gmail.com" <python@gmail.com>;
"realadmin@gmail.com" <realadmin@gmail.com>;
"reply@gmail.com" <reply@gmail.com>;
"replying@gmail.com" <replying@gmail.com>;
"sdfsdfsd@gmail.com" <sdfsdfsd@gmail.com>;
"sdsf@gmail.com" <sdsf@gmail.com>;
"someemail@gmail.com" <someemail@gmail.com>;
"test@gmail.com" <test@gmail.com>;
"testing@gmail.com" <testing@gmail.com>;
"testingmarkdown@gmail.com" <testingmarkdown@gmail.com>;
"tryingfocus@gmail.com" <tryingfocus@gmail.com>;
"Umesh" <umesschaudhary@gmail.com>;

4. Generate Password

The following command will generate a random password for provided length.

./manage.py generate_password --length=8

This uses Django core’s default password generator

5. Graph models

With django-extensions installed we can create an image of the database schema and relations by using the graph_models command:

./manage.py graph_models -a -o models.png

It requires either pygraphviz or pydotplus package to generate the graphs.

pip3 install pygraphviz

Also, the following packages is required to be installed on ur system.

apt-get -y install graphviz graphviz-dev #on debian system

It will generate a png file that looks like this.

myapp_models.png

6. Reset db

The following command will run DROP DATABASE and CREATE DATABASE thus resetting the database.

./manage.py reset_db --noinput

7. Admin generator

The following command will generate the admin code on console. Then they can be used on the admin.py file.

python manage.py admin_generator blog

That's a wrap

Furthermore there is more that django-extensions provides. Here is the official documentation that you can go through.

Happy Learning!