Как заменить первичный ключ Django другим целым числом, уникальным для этой таблицы
У меня есть веб-приложение Django, которое использует автоинкрементные положительные целые числа по умолчанию в качестве первичного ключа. Этот ключ используется во всем приложении и часто вставляется в URL. Я не хочу показывать этот номер общественности, чтобы они могли угадать количество пользователей или других объектов в моей базе данных.
Это частое требование, и я видел вопросы, похожие на мои с ответами. Большинство решений рекомендует хэшировать исходное значение первичного ключа. Однако ни один из этих ответов точно не соответствует моим потребностям. Это мои требования:
Я хотел бы сохранить тип поля первичного ключа как целое число.Я также предпочел бы не хэшировать / не хэшировать это значение каждый раз, когда оно читается или записывается или сравнивается с базой данных. Это кажется бесполезным. Было бы неплохо сделать это только один раз: когда запись изначально вставлена в базу данных.Функция хеширования / шифрования не должна быть обратимой, поскольку мне не нужно восстанавливать исходный последовательный ключ. Хэшированное значение просто должно быть уникальным.Хэшированное значение должно быть уникальным ТОЛЬКО для этой таблицы, а не универсально уникальным.Хэшированное значение должно быть как можно короче. Я хотел бы избежать очень длинных (более 20 символов) URLКаков наилучший способ добиться этого? Будет ли следующая работа?
def hash_function(int):
return fancy-hash-function # What function should I use??
def obfuscate_pk(sender, instance, created, **kwargs):
if created:
logger.info("MyClass #%s, created with created=%s: %s" % (instance.pk, created, instance))
instance.pk = hash_function(instance.pk)
instance.save()
logger.info("\tNew Pk=%s" % instance.pk)
class MyClass(models.Model):
blahblah = models.CharField(max_length=50, null=False, blank=False,)
post_save.connect(obfuscate_pk, sender=MyClass)