Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

177
Visualizações
Django: ID corta no lineal no predecible en la URL

Sé que hay preguntas similares (como this , this , this y this ) pero tengo requisitos específicos y busco una forma menos costosa de hacer lo siguiente (en Django 1.10.2):

Buscando no tener identificadores enteros secuenciales/adivinables en las URL e idealmente cumplir con los siguientes requisitos:

  • Evite los UUID ya que eso hace que la URL sea muy larga.
  • Evite una clave principal personalizada. No parece funcionar bien si los modelos tienen ManyToManyFields. Se vio afectado por al menos tres errores al intentar eso ( #25012 , #24030 y #22997 ), incluido el desorden de las migraciones y tener que eliminar toda la base de datos y volver a crear las migraciones (bueno, mucho aprendizaje también)
  • Evite verificar colisiones si es posible (por lo tanto, evite una búsqueda de db para cada inserción)
  • No solo quiera buscar por slug, ya que tiene menos rendimiento que solo buscar una identificación de número entero.
  • No se preocupe demasiado por cifrar la identificación, simplemente no quiera que sea un número entero visiblemente secuencial.

Nota: Es probable que la aplicación tenga alrededor de 5 millones de registros a largo plazo.

about 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Después de investigar muchas opciones sobre SO, blogs, etc., terminé haciendo lo siguiente:

  • Codificando la identificación en base32 solo para las URL y decodificándola nuevamente en urls.py (usando una versión editada de las funciones útiles de Django para codificar en base 36 ya que necesitaba letras mayúsculas en lugar de minúsculas).
  • No almacenar la identificación codificada en ningún lado . Simplemente codificando y decodificando cada vez sobre la marcha.
  • Mantener intacta la identificación predeterminada y usarla como clave principal.

(buenos consejos , publicaciones y especialmente este comentario ayudaron mucho)

Lo que esta solución ayuda a lograr:

  1. Absolutamente ninguna edición de modelos o señales post_save.
  2. No se necesitan comprobaciones de colisión. Evitar una solicitud adicional a la base de datos.
  3. La búsqueda todavía ocurre en la identificación predeterminada, que es rápida. Además, no hay solicitudes dobles de guardado () en el modelo para cada inserción.
  4. Identificación codificada corta y dulce (la cantidad de caracteres aumenta a medida que aumenta la cantidad de registros, pero aún no es muy larga)

Lo que no ayuda a lograr/cualquier inconveniente:

  1. Cifrado: la identificación está codificada pero no encriptada, por lo que el usuario aún puede descubrir el patrón para llegar a la identificación (pero no me importa mucho, como se mencionó anteriormente).
  2. Una pequeña sobrecarga de codificación y decodificación en cada construcción/solicitud de URL, pero tal vez eso sea mejor que las comprobaciones de colisión y/o varias llamadas save() en el objeto modelo para las inserciones.

Como referencia, parece que hay varias formas de generar ID aleatorias que descubrí en el camino (como get_random_string de Django, random de Python, UUIDField de Django, etc.) y muchas formas de codificar la ID actual (base 36, base 62, XORing y qué no). La ID codificada también se puede almacenar como otro campo (indexado) y buscar cada vez (como aquí ), pero depende de los parámetros de rendimiento de la aplicación web (ya que buscar una ID de varchar tiene menos rendimiento que buscar una ID de número entero). Este campo de identificador se puede guardar desde la función save() de un modelo sobrescrito, o usando una señal post_save() (ver aquí ) (mientras que ambos enfoques necesitarán que se llame a la función save() dos veces por cada inserción).

Todos los oídos a las optimizaciones del enfoque anterior. Me encanta SO y la comunidad. Siempre hay mucho que aprender aquí.

Actualización: después de más de un año de esta publicación, ¡encontré esta gran biblioteca llamada hashids que hace más o menos lo mismo bastante bien! Está disponible en muchos idiomas, incluido Python .

about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda