Django に電話番号を保存するための最良の方法
データベースを作成するときに、特定のデータのフィールドタイプを決定できないという問題が発生することがよくあります。ほとんどの場合、いくつかのフィールドタイプの整理について混乱します。例:一意の番号を格納する必要がある場合は、文字フィールドまたは整数フィールドのいずれかを選択する必要があります。各フィールドタイプには、独自の長所と短所があります。
そのようなデータの 1つは電話番号です。電話番号を保存するときは、フィールドが世界中のどこからでも電話番号を保持できることを確認する必要があります。電話番号自体と一緒に国コードを保持していることを確認する必要があります。
この記事では、Django に電話番号を保存するための最良の方法のいくつかについて説明します。
サードパーティの Django アプリの PhoneNumberField を使用して電話番号を保存する
電話番号を保存するには、このフィールドを実装するサードパーティの Django アプリまたはライブラリを使用できます:PhoneNumberField。
このライブラリまたはアプリケーションの GitHub リポジトリはここにあります。
公式の README によると、この Django ライブラリは電話番号を検証および変換できます。このライブラリは、別の Python ライブラリ python-phonenumbersとインターフェースします。これは、Android の電話番号処理を強化する Google の libphonenumberライブラリのポートです。
Django ライブラリをインストールする
この Django ライブラリは、次の pip コマンドを使用してダウンロードできます。
pip install django-phonenumber-field[phonenumbers]
これは大規模なライブラリであるため、サイズの点で、より軽いバージョンをダウンロードすることをお勧めします。このライブラリの軽量バージョンをダウンロードするには、次のコマンドを使用します。
pip install django-phonenumber-field[phonenumberslite]
Django ライブラリをセットアップする
このアプリまたはライブラリを使用するには、プロジェクトの settings.py ファイル内に追加する必要があります。アプリ名は、次のように INSTALLED_APPS 内に入力する必要があります。
INSTALLED_APPS = [
# Other apps
"phonenumber_field",
]
Django ライブラリを使用する
このライブラリには、電話番号を保存するために使用できるモデルフィールド PhoneNumberField があります。モデルは次のようになります。
from phonenumber_field.modelfields import PhoneNumberField
class Person(models.Model):
firstName = models.CharField(max_length=100)
middleName = models.CharField(max_length=100)
lastName = models.CharField(max_length=100)
phoneNumber = PhoneNumberField(unique=True, null=False, blank=False) # Here
secondPhoneNumber = PhoneNumberField(null=True, blank=True) # Here
PhoneNumberField フィールドは内部的に CharField スペースに基づいており、国際電話番号標準に基づいて文字列の形式で番号を格納します。
このライブラリの詳細については、公式ドキュメントを参照してください。
ここで、このフィールドの値にアクセスするために、次のような Python ステートメントを記述します。
person = models.Person.objects.get(id=25)
phoneNumber = person.phoneNumber.as_e164
ここでは、as_e164 のため、電話番号は E.164 標準の文字列として返されます。E.164 は、電話番号を保存するための国際標準です。あなたはそれについてもっと読むことができますここ。
バリデーターと Django モデルを使用して電話番号を保存する
サードパーティの Django アプリを使用せず、Django モデルを使用して電話番号を保存したくない場合は、Validator と CharField を使用できます。次のコードは同じことを示しています。
from django.core.validators import RegexValidator
class Person(models.Model):
phoneNumberRegex = RegexValidator(regex=r"^\+?1?\d{8,15}$")
phoneNumber = models.CharField(
validators=[phoneNumberRegex], max_length=16, unique=True
)
phoneNumberRegex バリデーターは、CharField に入力された値を検証します。この場合も、電話番号は E.164 形式で保存されます。
E.164 標準では数値に最大 15 桁が許可されているため、CharField の最大長は 16 文字です。15 文字には、国コードと電話番号の両方が含まれます。国コードのプレフィックスである+ 記号用に追加の文字が予約されています。
