How to Use UUID as a Primary ID in Django Models
Intro
In Django whenever we create any new model, there is an ID
-or PK
, model
field attached to it. The ID
field’s data type is integer
by default.
To make this integer id field UUID
, we can use UUIDField
model field, which
was added in Django 1.8
.
UUID
A universally unique identifier (UUID) is a 128-bit number used to identify information in computer systems. They are commonly represented as 32 hexadecimal characters separated by four hyphens.
There are 5 versions of UUID:
- Version 1: date-time and MAC address
- Version 2: date-time and MAC address, DCE security version
- Versions 3: namespace name-based
- Version 4: random
- Version 5: namespace name-based
For more details go to : WIKI UUID
Which UUID Version To Choose
There are two different ways of generating an UUID.
If you just need a “unique ID”, you want a version 1 or version 4:
Version 1: This generates a unique ID based on a network card MAC address and a timer. These IDs are easy to predict (given one, I might be able to guess another one) and can be traced back to your network card. It’s not recommended to create these.
Version 4: These are generated from random (or pseudo-random) numbers. If you just need to generate a UUID, this is generally what you want.
If you need to always generate the “same” or “reproducible” UUID" from a given name, you want a version 3 or version 5. It means that if you feed that algorith with the same input, it will generate the same output.
Version 3: This generates a unique ID from an MD5 hash of a namespace and name. If you need backwards compatibility (with another system that generates UUIDs from names), use this.
Version 5: This generates a unique ID from an SHA-1 hash of a namespace and name. This is the preferred version.
Collision
The probability to find a duplicate within 103 trillion version-4 UUIDs is one in a billion.
It means that if you produce “every second” an UUID for 3,266,108
year, your
collision chance is .000000001
.
Django Model
As we mentioned earlier, we will use UUIDField
model field and “version 4” UUID
as the default value for the field.
So let’s create a model:
#src/myapp/models.py
import uuid
from django.db import models
from django.utils.translation import ugettext_lazy as _
class Event(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(_("Name of Event"), blank=True, max_length=255)
Run migrations to activate the model:
$ python manage.py makemigrations
$ python manage.py migrate
Test the Model
In the root directory of your project, run to activate python shell:
$ python manage.py shell
Type below codes:
# import the model
>>> from src.myapp.models import Event
# create and save an event
>>> event = Event(name="FullMoon")
>>> event.save()
# get al objects from database
>>> obj = Event.objects.all()
# get the id of the one that we just created
>>> obj.first().id
UUID('35bfdc19-6ec2-4c41-b0a3-b50d07b30043')
>>> obj.first().pk
UUID('35bfdc19-6ec2-4c41-b0a3-b50d07b30043')
As you can see, our new model uses UUID as an ID. And our UUID is
35bfdc19-6ec2-4c41-b0a3-b50d07b30043
.
All done!
References: