HOWTO · Django
Las mejores formas de almacenar números de teléfono en Django
Descubra varias formas de almacenar números de teléfono en Django.
En esta página
Para almacenar números internacionales en un modelo de Django, usa django-phonenumber-field y su PhoneNumberField: analiza y valida los números mediante metadatos telefónicos que tienen en cuenta la región. Un validador personalizado de Django puede bastar si tu aplicación acepta un formato de número limitado y definido explícitamente. En ambos casos, guarda los números de teléfono como texto, no como enteros: son identificadores, y convertirlos a enteros puede eliminar el signo más o los ceros iniciales.
Ejecuta este ejemplo:
phone_number = "+1 415 555 0132"
print(phone_number)
print(type(phone_number).__name__)
+1 415 555 0132
str
El ejemplo muestra por qué un número de teléfono debe guardarse en un campo de cadena. No analiza ni valida el número; si necesitas esas operaciones para datos internacionales, usa el paquete de la sección siguiente.
Almacenar números de teléfono con el PhoneNumberField de una aplicación Django de terceros
Instala django-phonenumber-field con uno de estos extras: phonenumbers, que ofrece el port de Python más completo, o phonenumberslite, que incluye un paquete de metadatos más ligero. Por ejemplo, ejecuta python -m pip install "django-phonenumber-field[phonenumbers]" en el entorno de tu proyecto. Para usar el extra ligero, sustituye phonenumbers por phonenumberslite. Son extras alternativos; elige según la cobertura de metadatos que necesite tu aplicación. El proyecto se mantiene en django-phonenumber-field en GitHub. Usa python-phonenumbers, un port para Python de libphonenumber de Google.
Añade "phonenumber_field" a INSTALLED_APPS en la configuración de Django. Después, importa PhoneNumberField desde phonenumber_field.modelfields y decláralo en un modelo; por ejemplo: phone_number = PhoneNumberField(unique=True). Para un número opcional, puedes usar phone_number = PhoneNumberField(blank=True, null=True). Incluye la importación habitual from django.db import models y coloca estas declaraciones dentro de la clase del modelo. Estos fragmentos dependen del framework: requieren Django y el paquete en un proyecto configurado, así que no son ejemplos independientes que puedan ejecutarse por sí solos.
PhoneNumberField almacena el valor como texto y proporciona un objeto de número de teléfono para analizar, validar y dar formato. Son tareas relacionadas, pero distintas: el análisis interpreta la entrada teniendo en cuenta una región; la validación la comprueba frente a los metadatos de los planes de numeración; la normalización produce una representación canónica; y el formato de presentación adapta el valor para las personas. Si los usuarios pueden introducir números en formato nacional, configura una región predeterminada en Django; sin suficiente contexto regional, esos números no se pueden interpretar de forma fiable. Para acceder a un registro existente, usa su atributo en la instancia del modelo, como person.phone_number, y recurre a la propiedad as_e164 cuando necesites una representación E.164. Consulta la documentación del proyecto para obtener detalles sobre la configuración y el campo, y E.164 para conocer el plan internacional de numeración.
Almacenar números de teléfono con un validador y un modelo de Django
Si la aplicación acepta solo un formato de número limitado y puedes definir sus reglas, RegexValidator de Django puede validar un CharField. Por ejemplo, importa RegexValidator desde django.core.validators, define phone_number_validator = RegexValidator(regex=r"^\+?1?\d{8,15}$") y pásalo a un campo del modelo así: phone_number = models.CharField(max_length=16, validators=[phone_number_validator], unique=True). Coloca estas declaraciones dentro de una clase de modelo que importe models desde django.db. Esta ilustración depende de Django y no se ha ejecutado como ejemplo independiente.
La expresión es un patrón limitado que admite un código de país de EE. UU. opcional y un intervalo de cantidad de dígitos. No valida números de teléfono de todo el mundo, no comprueba si un número está asignado y no equivale a PhoneNumberField. Úsala solo si esas restricciones coinciden con los números que acepta tu aplicación; de lo contrario, elige la opción basada en el paquete o define un validador según los requisitos reales de la aplicación.
E.164 permite un máximo de 15 dígitos; el signo + inicial de su representación internacional es un carácter aparte. Un campo con max_length=16 puede almacenar esa representación, pero la longitud por sí sola no garantiza que se cumplan la sintaxis de E.164 ni las reglas de numeración de cada país. Un validador debe comprobar el prefijo permitido y la cantidad de dígitos; para una validación internacional más completa hacen falta metadatos de los planes de numeración. En cualquiera de los dos campos del modelo, decide si los números deben ser únicos y si el campo puede estar vacío o ser nulo según tu modelo de datos.