Sometimes you want an alternative to the traditional consecutive database ids i.e. to keep people from walking your site. Below is the code to generate an external id (a random 5 character field) when a model instance is created. I have used this on a couple of sites now and I am pretty happy with it.
Download the source.
models.py
from django.contrib.auth.models import User
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
import random
class YourModelManager(models.Manager):
@staticmethod
def _random_id(prefix='', length=5):
alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
for x in range(length):
prefix += random.choice(alphabet)
return prefix
@classmethod
def _generate_external_id(cls):
external_id = cls._random_id()
while (YourModel.objects.filter(external_id=external_id).count() > 0):
external_id = cls._random_id()
return external_id
def create(self, **kwargs):
kwargs['external_id'] = self._generate_external_id()
return self.get_query_set().create(**kwargs)
def get_or_create(self, **kwargs):
try:
return self.get_query_set().get(**kwargs), False
except self.model.DoesNotExist:
kwargs['external_id'] = self._generate_external_id()
return self.get_query_set().get_or_create(**kwargs)
class YourModel(models.Model):
external_id = models.CharField(max_length=5, unique=True)
objects = YourModelManager()







Be the first to comment.