Skip to content

jaddison/django-prefix-id

Repository files navigation

Overview

django-prefix-id is a simple package that contains a single Django model field, PrefixIDField. PrefixIDField is

  • based on Django's CharField
  • allows using a prefix (recommended for context)
    • enables some very interesting product usage and querying patterns
  • autogenerates a unique id by default (auto-including the prefix, if provided)
    • uses uuid.uuid4() to generate a 128-bit integer, which is then base62-encoded
  • auto-sets the max_length field property, factoring in the provided prefix length and a known max length of 22 characters for a base62-encoded 128-bit integer

Why work with IDs like 7584358 or '7fca5f1d-f867-4696-960b-e57274cc5647' when you could have something swanky like 'user_4wr7jBDTEqVBCsXEih4zfP'?

If you already like to use UUIDs as IDs, you should use django-prefix-id! If you currently use autoincrementing IDs, you should also consider using django-prefix-id, from an obfuscation point of view.

Installation

$ pip install django-prefix-id

Usage

from prefix_id import PrefixIDField

class Book(models.Model):
    id = PrefixIDField(prefix="book", primary_key=True)
    title = models.CharField(max_length=100, blank=False)
    ...

Make your migrations, as you normally would:

$ python manage.py makemigrations

Development

$ pip -m venv venv
$ source /venv/bin/activate
$ pip install -r requirements.txt

Testing

Manually run tests:

$ pytest

Test coverage is at 100%. To get test coverage output:

$ pytest --cov --cov-report html
# OR
$ pytest --cov

To cover a breadth of likely usage scenarios, tox is the tool of choice. It is set up with a matrix covering various combinations of Python versions 3.8 - 3.12 with Django 4.2 and 5.0.

See tox.ini to enable testing Django versions as far back as Django 3.2 - tests pass across the board, but for simplicity only latest LTS Django and other currently supported versions will be considered in scope.

Run the test suite against all enabled versions:

$ tox

Backstory and Inspiration

Stripe-like prefixed entity IDs have long been a topic of interest to me, and the improved user experience that they can provide. I'd gone through a couple of iterations with FastAPI and Django - and thought I might as well release something that I'm happy with sharing publicly.

About 80% through this effort, I found yunojuno's django-charid-field project, and took some further inspiration from it - so thanks to them!

(It also appears we have other project interests in common!)

About

A modern Django model ID field, enabling prefixed Stripe-like IDs. Base62 encoding UUID values.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages