DEV Community

Serhat Teker
Serhat Teker

Posted on • Originally published at tech.serhatteker.com on

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:

  1. Version 1: date-time and MAC address
  2. Version 2: date-time and MAC address, DCE security version
  3. Versions 3: namespace name-based
  4. Version 4: random
  5. 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.

1. 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.

2. 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)
Enter fullscreen mode Exit fullscreen mode

Run migrations to activate the model:

$ python manage.py makemigrations
$ python manage.py migrate
Enter fullscreen mode Exit fullscreen mode

Test the Model

In the root directory of your project, run to activate python shell:

$ python manage.py shell
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

As you can see, our new model uses UUID as an ID. And our UUID is
35bfdc19-6ec2-4c41-b0a3-b50d07b30043.

All done!


References:

Top comments (0)