0
0
DjangoHow-ToBeginner · 3 min read

How to Update or Create Records in Django Efficiently

In Django, use the update_or_create() method on a model's manager to update an existing record or create a new one if it doesn't exist. This method takes defaults for fields to update and lookup parameters to find the record.
📐

Syntax

The update_or_create() method has this pattern:

  • lookup_fields: Fields to find the existing record.
  • defaults: A dictionary of fields to update or set if creating.
  • Returns a tuple: (object, created) where created is True if a new record was created.
python
Model.objects.update_or_create(
    lookup_field=value,
    defaults={
        'field1': new_value1,
        'field2': new_value2,
    }
)
💻

Example

This example shows how to update a user's email if the username exists, or create a new user if it doesn't.

python
from django.contrib.auth.models import User

user, created = User.objects.update_or_create(
    username='alice',
    defaults={'email': 'alice@example.com'}
)

if created:
    print('New user created:', user.username)
else:
    print('User updated:', user.username, 'with email', user.email)
Output
User updated: alice with email alice@example.com
⚠️

Common Pitfalls

Common mistakes include:

  • Not using defaults for fields to update, which causes errors.
  • Using fields in defaults that are also in lookup, which is redundant.
  • Assuming update_or_create() always creates; it only creates if no match is found.
python
from django.contrib.auth.models import User

# Wrong: putting lookup field in defaults
user, created = User.objects.update_or_create(
    username='bob',
    defaults={'username': 'bob', 'email': 'bob@example.com'}  # 'username' should not be here
)

# Right:
user, created = User.objects.update_or_create(
    username='bob',
    defaults={'email': 'bob@example.com'}
)
📊

Quick Reference

Remember these tips when using update_or_create():

  • Use lookup fields to find the record.
  • Use defaults to specify fields to update or set.
  • Check the created boolean to know if a new record was made.
  • It runs inside a transaction to avoid race conditions.

Key Takeaways

Use update_or_create() to update existing records or create new ones in one call.
Pass lookup fields as arguments and fields to update inside defaults dictionary.
Check the returned created boolean to know if a new record was created.
Avoid putting lookup fields inside defaults to prevent errors.
update_or_create() runs atomically to prevent race conditions.