Tengo una app de django con varios modelos, algunos con claves foráneas entre sí, nada especialmente complicado. Todos los modelos tienen un pk proporcionado automáticamente por BigAutoField, ya que eso es lo que se define en la configuración.
Ahora he agregado vistas de API usando DRF ModelViewSets para obtener json para usar en algunos javascript en el navegador. Sin embargo, cuando convierto la cadena json en un objeto javascript, el pk (el campo se llama id) se trata como un número (como se esperaba). Sin embargo, muchos de los pk son más grandes que el valor seguro máximo del número de javascript, por lo que los últimos dígitos se muestran como ceros. Esto hace que el pk sea inútil para seleccionar o comparar elementos. Soy bastante nuevo tanto en DRF como en Javascript, pero siento que este es un caso de uso muy común, por lo que creo que probablemente haya una forma aceptada de manejar esto.
Por lo que puedo decir, hay varias maneras de hacer esto:
id = serializers.CharField() para todos los serializadores de modelos y use comparaciones de cadenas en JS.id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) como clave principal.DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' en su lugar, ya que nunca tendré cerca de 2147483647 entradas en ninguna tabla.¿Es esto correcto? ¿Me estoy perdiendo de algo? ¿Cómo se manejan normalmente los paquetes en una configuración API/SPA separada?
Use
id = serializers.CharField()para todos los serializadores de modelos y use comparaciones de cadenas en JS.
Sí, solo usa cadenas. Las claves primarias sustitutas nunca necesitan usarse como números en los cálculos. Esto es muy común para JSON que debe analizarse usando JSON.parse normal, no algo creado específicamente para tratar con bigints .