HOWTO · Django

Melhores maneiras de armazenar números de telefone no Django

Descubra várias maneiras de armazenar números de telefone no Django.

Nesta página

Para números internacionais em um modelo Django, use django-phonenumber-field e seu PhoneNumberField; ele interpreta e valida números com metadados de telefonia que levam a região em conta. Um validador personalizado do Django pode bastar quando a aplicação aceita um formato de número restrito e definido explicitamente. Em ambos os casos, armazene números de telefone como texto, não como inteiros: um número de telefone é um identificador, e a conversão para inteiro pode remover o sinal de mais inicial ou um zero à esquerda.

Execute este exemplo:

phone_number = "+1 415 555 0132"
print(phone_number)
print(type(phone_number).__name__)
+1 415 555 0132
str

O exemplo mostra por que um número de telefone deve ficar em um campo de texto. Ele não interpreta nem valida o número; use o pacote abaixo quando precisar dessas operações para entradas internacionais.

Armazene números de telefone com o PhoneNumberField de um aplicativo Django de terceiros

Instale django-phonenumber-field com uma das opções extras: phonenumbers, que fornece a implementação Python mais completa, ou phonenumberslite, que oferece um pacote de metadados mais leve. Por exemplo, execute python -m pip install "django-phonenumber-field[phonenumbers]" no ambiente do projeto. Para usar a opção lite, substitua phonenumbers por phonenumberslite. Essas opções são alternativas; escolha de acordo com a cobertura de metadados de que a aplicação precisa. O projeto é mantido em django-phonenumber-field no GitHub. Ele usa python-phonenumbers, uma implementação Python da biblioteca libphonenumber do Google.

Adicione "phonenumber_field" a INSTALLED_APPS nas configurações do Django. Em seguida, importe PhoneNumberField de phonenumber_field.modelfields e declare o campo em um modelo, por exemplo: phone_number = PhoneNumberField(unique=True). Para permitir que o número seja opcional, use phone_number = PhoneNumberField(blank=True, null=True). Inclua o import habitual from django.db import models e coloque essas declarações dentro da classe do modelo. Estes trechos dependem do framework: exigem Django e o pacote em um projeto configurado e não são exemplos autônomos para execução.

Um PhoneNumberField armazena o valor como texto e fornece um objeto de número de telefone para interpretação, validação e formatação. Essas tarefas se relacionam, mas são distintas: a interpretação considera o contexto regional da entrada; a validação verifica o número com base nos metadados do plano de numeração; a normalização produz uma representação canônica; e a formatação de exibição apresenta o número para as pessoas. Defina uma região padrão na configuração do Django quando os usuários puderem informar números no formato nacional. Sem contexto regional suficiente, não é possível interpretar esse tipo de entrada com segurança. Para acessar um registro existente, use o valor na instância do modelo, como person.phone_number, e consulte a propriedade as_e164 quando precisar de uma representação E.164. Consulte a documentação do projeto para detalhes sobre configuração e campos, e E.164 para conhecer o plano internacional de numeração.

Armazene números de telefone com um validador e um modelo Django

Se a aplicação aceitar apenas um formato de número limitado e você puder definir suas regras, o RegexValidator do Django poderá validar um CharField. Por exemplo, importe RegexValidator de django.core.validators, defina phone_number_validator = RegexValidator(regex=r"^\+?1?\d{8,15}$") e passe-o ao campo do modelo desta forma: phone_number = models.CharField(max_length=16, validators=[phone_number_validator], unique=True). Coloque essas declarações dentro de uma classe de modelo que importe models de django.db. Esta ilustração depende do Django e não foi executada como exemplo autônomo.

Essa expressão define um padrão restrito, com código de país dos EUA opcional e uma faixa de quantidade de dígitos. Ela não valida números de telefone do mundo todo, não verifica se um número foi atribuído e não equivale a PhoneNumberField. Use-a somente se essas restrições corresponderem aos números aceitos pela aplicação; caso contrário, prefira a abordagem com o pacote ou crie um validador de acordo com os requisitos reais da aplicação.

E.164 permite no máximo 15 dígitos; o sinal + inicial usado na representação internacional é um caractere separado. Um campo com max_length=16 comporta essa representação, mas o limite de comprimento, por si só, não garante a sintaxe E.164 nem as regras de numeração específicas de cada país. Um validador precisa conferir o prefixo permitido e a quantidade de dígitos; uma validação internacional mais completa exige metadados do plano de numeração. Para qualquer um dos campos de modelo, decida se os números precisam ser exclusivos e se o campo pode ficar em branco ou aceitar valor nulo conforme o modelo de dados.