Skip to main content

A Hashids obfuscated Django Model Field

Project description

A custom Model Field that uses the Hashids library to obfuscate an IntegerField or AutoField. It can be used in new models or dropped in place of an existing IntegerField, explicit AutoField, or an automatically generated AutoField.

Features

  • Stores IDs as integers in the database

  • Allows lookups and filtering by either integer, hashid string or Hashid object

  • Can be used as sort key

  • Can drop-in replace an existing IntegerField (HashidField) or AutoField (HashidAutoField)

  • Allows specifying a salt globally

  • Supports custom salt, min_length and alphabet settings per field

Installation

Install the package (preferably in a virtualenv):

$ pip install django-hashid-field

Add it to your model

from hashid_field import HashidField

class Book(models.Model):
    reference_id = HashidField()

Migrate your database

$ ./manage.py makemigrations
$ ./manage.py migrate

Upgrading

Please see the Change Log

Basic Usage

Use your field like you would any other, for the most part. You can assign integers:

>>> b = Book()
>>> b.reference_id = 123
>>> b.reference_id
Hashid(123): OwLxW8D

You can assign valid hashids. It’s valid only if it can be decoded into an integer based on your salt:

>>> b.reference_id = 'r8636LO'
>>> b.reference_id
Hashid(456): r8636LO

You can access your field with either integers, hashid strings or Hashid objects:

>>> Book.objects.filter(reference_id=123)
<QuerySet [<Book:  (OwLxW8D)>]>
>>> Book.objects.filter(reference_id='OwLxW8D')
<QuerySet [<Book:  (OwLxW8D)>]>
>>> b = Book.objects.get(reference_id='OwLxW8D')
>>> b
<Book:  (OwLxW8D)>
>>> h = b.reference_id
>>> h
Hashid(123): OwLxW8D
>>> Book.objects.filter(reference_id=h)
<Book:  (OwLxW8D)>

The objects returned from a HashidField are an instance of the class Hashid, and allow basic access to the original integer or the hashid:

>>> from hashid_field import Hashid
>>> h = Hashid(123)
>>> h.id
123
>>> h.hashid
'Mj3'
>>> print(h)
Mj3
>>> repr(h)
'Hashid(123): Mj3'

Hashid Auto Field

Along with HashidField there is also a HashidAutoField that works in the same way, but that auto-increments.

from hashid_field import HashidAutoField

class Book(models.Model):
    serial_id = HashidAutoField()

The only difference is that if you don’t assign a value to it when you save, it will auto-generate a value from your database, just as an AutoField would do:

>>> b = Book()
>>> b.save()
>>> b.serial_id
Hashid(1): AJEM7LK

It can be dropped into an existing model that has an auto-created AutoField (all models do by default) as long as you give it primary_key=True. So if you have this model:

class Author(models.Model):
    name = models.CharField(max_length=40)

Then Django has created a field for you called ‘id’ automatically. We just need to override that by specifying our own field with primary_key set to True.

class Author(models.Model):
    id = HashidAutoField(primary_key=True)
    name = models.CharField(max_length=40)

And now you can use the ‘id’ or ‘pk’ attributes on your model instances:

>>> a = Author.objects.create(name="John Doe")
>>> a.id
Hashid(60): N8VNa8z
>>> Author.objects.get(pk='N8VNa8z')
<Author: Author object>

Settings

HASHID_FIELD_SALT

You can optionally set a global Salt to be used by all HashFields and HashidAutoFields in your project, or set the salt on each individual field.

Type:

string

Default:

“”

Example:
HASHID_FIELD_SALT = "a long and secure salt value that is not the same as settings.SECRET_KEY"

Field Parameters

Besides the standard field options, there are 3 settings you can tweak that are specific to HashidField and AutoHashidField.

Please note that changing any of these values will affect the obfuscation of the integers that are stored in the database, and will change what are considered “valid” hashids. If you have links or URLs that include your HashidField values, then they will stop working after changing any of these values. It’s highly advised that you don’t change any of these settings once you publish any references to your field.

salt

Type:

string

Default:

settings.HASHID_FIELD_SALT

Example:
reference_id = HashidField(salt="Some salt value")

min_length

Type:

int

Default:

7

Note:

This defaults to 7 for the field since the maximum IntegerField value can be encoded in 7 characters with the default alphabet setting of 62 characters.

Example:
reference_id = HashidField(min_length=15)

alphabet

Type:

string of characters (16 minimum)

Default:

Hashids.ALPHABET, which is “abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890”

Example:
# Only use numbers and lower-case letters
reference_id = HashidField(alphabet="0123456789abcdefghijklmnopqrstuvwxyz")

Hashid Class

Operations with a HashidField or HashidAutoField return a Hashid object. This simple class does the heavy lifting of converting integers and hashid strings back and forth. There shouldn’t be any need to instantiate these manually.

Methods

__init__(id, salt=’’, min_length=0, alphabet=Hashids.ALPHABET):

id:

REQUIRED Integer you wish to encode

salt:

Salt to use. Default: ‘’

min_length:

Minimum length of encoded hashid string. Default: 0

alphabet:

The characters to use in the encoded hashid string. Default: Hashids.ALPHABET

set(id)

id:

Integer you with to encode

Instance Variables

id

type:

Int

value:

The decoded integer

hashid

type:

String

value:

The encoded hashid string

hashids

type:

Hashids()

value:

The instance of the Hashids class that is used to encode and decode

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-hashid-field-1.0.0.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_hashid_field-1.0.0-py2.py3-none-any.whl (10.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file django-hashid-field-1.0.0.tar.gz.

File metadata

File hashes

Hashes for django-hashid-field-1.0.0.tar.gz
Algorithm Hash digest
SHA256 29ffc06caaca4904084b6bba4f096aea24d2212857def1a497627399a24ca8c1
MD5 825b052633cf14092867f3337bb0260c
BLAKE2b-256 3a9b90ba8f4b8d5d4b845a582a10fb38206007c57c3da9e5dbef59561c87abcd

See more details on using hashes here.

File details

Details for the file django_hashid_field-1.0.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_hashid_field-1.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 aac70dcb1803307aba96de2cf13be4e165482922d28b8495c037f127b2cb0182
MD5 9b7036cb7d4ab9b0da2bbf39108e3818
BLAKE2b-256 a82b239bf1fbc83fa6230f4c6e316f3bf9b3d2646b5650decac43be97355232e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page