How to Use "get_or_create()" in Django?
Last Updated :
23 Jul, 2025
In Django, the get_or_create()
method is a convenient shortcut for retrieving an object from the database if it exists, or creating it if it doesn’t. This method is especially useful when you want to avoid raising exceptions when querying objects and need to ensure an instance is always available.
Understanding get_or_create() in Djnago
The get_or_create()
method is available through Django’s ORM (Object Relational Mapping) and simplifies common database operations. It performs two actions:
- Get: Attempts to retrieve an existing object from the database using the specified lookup fields.
- Create: If the object does not exist, it creates a new object using the provided fields.
This method returns a tuple containing the object and a boolean value (True
if the object was created, and False
if it was retrieved).
The syntax looks like this:
ModelName
: The name of your Django model.field1=value1
, field2=value2
: Fields used for querying the database.defaults
={other_field: other_value}
: Optional dictionary to set additional fields if a new object is created.
Python
obj, created = ModelName.objects.get_or_create(field1=value1,
field2=value2, defaults={other_field: other_value})
Retrieving or Creating an Object
One of the most common use cases is to check if an object already exists in the database and create it if it doesn't.
Python
from myapp.models import Customer
customer, created = Customer.objects.get_or_create(
email='johndoe@example.com',
defaults={'name': 'John Doe', 'phone': '1234567890'}
)
if created:
print("A new customer was created.")
else:
print("Customer already exists.")
Here, Django first tries to find a Customer
object with the email johndoe@example.com
. If it exists, it will return the object and created
will be False
. If it doesn't exist, a new Customer
object will be created using the default values provided, and created
will be True
.
Preventing Duplicate Entries
get_or_create()
is particularly useful for avoiding duplicates when adding new data.
Python
from myapp.models import Tag
tag, created = Tag.objects.get_or_create(name='django')
if created:
print("Tag was created.")
else:
print("Tag already exists.")
In this example, if a Tag
with the name django
already exists, it will be retrieved, preventing duplicate entries.
Using get_or_create()
with Relationships
You can also use get_or_create()
with related models. For example, when you need to create a new post and associate it with an existing or new category.
Python
from myapp.models import Post, Category
category, created = Category.objects.get_or_create(name='Tech')
post = Post.objects.create(title='New Django Features', category=category)
If the category Tech
doesn’t exist, it will be created, and then the new Post
will be linked to it.
Handling Concurrency Issues
Since get_or_create()
involves a database lookup followed by a potential insert, there is a risk of race conditions when multiple users attempt to create the same object simultaneously. Django handles this by wrapping the operation in a transaction, so in most cases, you don’t need to worry about handling race conditions manually.
However, in some situations, you may want to manually handle the exception using Django’s IntegrityError
to deal with more complex use cases.
Python
from django.db import IntegrityError
try:
obj, created = ModelName.objects.get_or_create(field=value)
except IntegrityError:
obj = ModelName.objects.get(field=value)
Limitations of get_or_create()
While get_or_create()
is a powerful tool, it does have some limitations:
- It cannot be used with non-atomic databases like MySQL with MyISAM tables, as these do not support transactions.
- It’s best used for small, simple operations. For bulk creation, consider using Django’s
bulk_create()
method instead.