How to Generate Fake Data for your Django Project with Faker
Development is more efficient when you have data to work with. It’s hard to visualise what some of your pages will look like without data to fill them. For example, you don’t want to discover issues with your page layouts until after you go Live.
Creating test data will help mimic conditions of a Live site, which will help you find bugs early.
The problem is, creating lots of data manually is time consuming. In some cases, you may need hundreds or thousands of rows in your database to really understand how well your application performs.
Thankfully, there are solutions that will help you create data quickly.
Option 1: Fixtures
One of these methods is to create a fixture (JSON file). Django provides management commands (docs) such as dumpdata
which exports data from an existing database to a JSON file, and loaddata
which transfers data from JSON to the database.
This is useful if you already have a database to export data from, but it’s less useful when you’re starting from scratch.
Option 2: Write a script
Another solution is to write a script that will create objects in the database for you.
To automatically generate data for our fields, we will install a package called Faker (docs), a Python package that will generate all kinds of fake data.
To Do List Example
In this tutorial, we are going to use a To Do list app as an example.
We will write a script that will create 30 tasks for our To Do list app.
The code
You can find the before and after code for this tutorial on GitHub.
Step 1: Install Faker
Make sure your project has an active virtual environment.
Install Faker by running the following command in your terminal:
pip install faker
If you’re using requirements.in
, then add faker
to the file.
Step 2: Create a script
Create a script template
In the root directory (same directory as manage.py
, create a file called create_tasks.py
.
We are going to start with a template for a Python script. Unlike regular Python scripts, you will be able to import Django modules.
# create_tasks.py
def main():
tasks = Task.objects.all()
print(f"There are {tasks.count()} tasks in the database")
if __name__ == "__main__":
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
from todo.models import Task
main()
Test that the script runs correctly by running:
python create_tasks.py
I get the following output:
There are 3 tasks in the database
Step 2: Create some fake data
This is my script.
# create_tasks.py
def main():
fake: Faker = Faker()
for i in range(30):
task = Task.objects.create(
name=fake.paragraph(nb_sentences=1),
status=random.choice(Task.StatusChoice.choices)[0],
)
print(f"Created todo. Name: {task.name} Status: {task.status}")
task_count = Task.objects.count()
print(f"There are {task_count} todos in the database")
if __name__ == "__main__":
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
import random
from faker import Faker
from todo.models import Task
main()
On this line: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
, you will need to substitute mysite
with the name of your project (name of the folder than contains settings.py
.
This script will create 30 tasks in the database.
It begins by creating an instance of Faker
. The instance will have access to Faker’s methods such as address
and paragraph
.
It then creates a Task in the database. For the name
, it uses the fake.paragraph
method to generate a name. For the status
, we want to pick one randomly from the choices defined on the model (GitHub).
Run the script
To run the script, run the following command in your terminal:
python manage.py create_tasks.py
You should get an output similar to this:
...
...
Created todo. Name: Tend term citizen center. Status: To Do
Created todo. Name: Strong nor radio official. Status: Done
Created todo. Name: Theory which authority with bring campaign. Status: Doing
Created todo. Name: Each expect certainly break whom cup. Status: Doing
Created todo. Name: Effort pull send condition pull war his. Status: Done
There are 33 todos in the database
Check Admin
Go to the admin area to check that your task objects have been created correctly: