在 Django 中儲存電話號碼的最佳方法
在建立資料庫時,我們經常遇到無法確定特定資料的欄位型別的問題。大多數情況下,我們對組織某些欄位型別感到困惑。例如:如果我們必須儲存一個唯一的數字,我們必須在字元欄位或整數字段之間進行選擇。每種欄位型別都有自己的優點和缺點。
其中一個資料是電話號碼;在儲存電話號碼時,我們必須確保該欄位可以儲存來自世界任何地方的電話號碼。我們必須確保我們持有國家程式碼和電話號碼本身。
本文討論了在 Django 中儲存電話號碼的一些最佳方法。
使用第三方 Django 應用程式的 PhoneNumberField
儲存電話號碼
要儲存電話號碼,我們可以使用實現此欄位的第三方 Django 應用程式或庫:PhoneNumberField
。
你可以在此處找到此庫或應用程式的 GitHub 倉庫。
根據官方的 README
,這個 Django 庫可以驗證和轉換電話號碼。該庫與另一個 Python 庫 python-phonenumbers 介面,後者是支援 Android 電話號碼處理的 Google 的 libphonenumber 庫的一個埠。
安裝 Django 庫
可以使用以下 pip
命令下載這個 Django 庫:
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
格式儲存。
CharField
的最大長度為 16 個字元,因為 E.164
標準允許一個數字最多 15 位數字。15 個字元包括國家/地區程式碼和電話號碼。為 + 號保留了一個附加字元,它是國家/地區程式碼的字首。