Hello there! We are going to learn how to write simple custom Django commands. I will break down this lesson into 3 sections;
- Introduction
- Setting up the commands
- Calling the commands
Introduction
- Create a generic Django project called
resource_center
. - Make migrations and migrate your database.
- Create a Django app called
books
. Register this app insettings.py
- In your
book/models.py
create a modelBook
as shown below;
# books/models.py from django import models class Book(models.Model): name = models.CharField(max_length=50) author = models.CharField(max_length=20)
- Make migrations and migrate your database.
Setting Up Commands
Django convention dictates that custom commands have to live inside the project/app/management/commands
directory of your project. In this case, this will be resource_center/management/commands
.
Navigate to your books
folder and create a folder named management
. Create a subfolder called commands
.
Create a file inside the commands
folder and name it books_creator.py
.
Add the following code;
# resource_center/books/management/commands/books_creator.py from django.core.management.base import BaseCommand from resource_center.books.models import Book class Command(BaseCommand): help = "Create initial data for the project" def add_arguments(self, parser): # Positional arguments parser.add_argument("count", help="Any number", type=int) # Named (optional) arguments parser.add_argument( "--delete", help="Delete books instead of creating them", ) def handle(self, *args, **kwargs): count = kwargs.get("count") print(f"The current count is {count}") if kwargs["delete"]: Book.objects.all().delete() else: Book.objects.get_or_create( name="The Lord of the Rings", author="J.R.R. Tolkien" ) Book.objects.get_or_create( name="The Hobbit", author="J.R.R. Tolkien" )
Our class Command
inherits from Django's BaseCommand
.
The class variable help
describes what the custom command aims to achieve, more like the help_text
in your model fields.
The method add_arguments
is used to instruct the command to expect arguments which may be optional.
The method handle
handles (pun intended 😅) your logic.
Calling the commands
To call your commands, call them in the following format;
python manage.py <custom_command_file_name>
. Do not include the file's .py
extension.
In this case, our command will be called as
python manage.py books_creator <count>
The count
is any number of your choice. This is a positional argument that we can not ignore. If ignored, it will raise the following error; manage.py books_creator: error: the following arguments are required: count
.
The command with our count
positional argument will be as follows;
python manage.py books_creator 16
If you add the optional named arguments, you get a command like this;
python manage.py books_creator 16 --delete=true
That's it!
Top comments (0)