Como substituir a chave primária do Django por um número inteiro diferente que é exclusivo para essa tabela
Eu tenho um aplicativo da web Django que usa os números inteiros positivos incrementados automaticamente como a chave primária. Essa chave é usada em todo o aplicativo e é frequentemente inserida no URL. Não quero expor esse número ao público para que eles possam adivinhar o número de usuários ou outras entidades no meu banco de dados.
Este é um requisito frequente e tenho visto perguntas semelhantes às minhas com respostas. A maioria das soluções recomenda o hash do valor original da chave primária. No entanto, nenhuma dessas respostas se encaixa exatamente na minha necessidade. Estes são os meus requisitos:
Eu gostaria de manter o tipo de campo Chave Primária como Inteiro.Eu também preferiria não precisar fazer hash / unhash esse valor toda vez que for lido, gravado ou comparado ao banco de dados. Isso parece um desperdício Seria bom fazer isso apenas uma vez: quando o registro é inserido inicialmente no Banco de DadosA função de hash / criptografia não precisa ser reversível, pois não preciso recuperar a chave seqüencial original. O valor do hash só precisa ser único.O valor do hash precisa ser exclusivo SOMENTE para essa tabela - não universalmente exclusivo.O valor do hash deve ser o mais curto possível. Gostaria de evitar URLs extremamente longos (mais de 20 caracteres)Qual é a melhor maneira de conseguir isso? O seguinte trabalho?
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)