在 Django 中儲存電話號碼的最佳方法

Vaibhav Vaibhav 2023年1月30日
  1. 使用第三方 Django 應用程式的 PhoneNumberField 儲存電話號碼
  2. 使用驗證器和 Django 模型儲存電話號碼
在 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 模型儲存電話號碼,你可以使用 ValidatorCharField。以下程式碼描述了相同的內容:

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 個字元包括國家/地區程式碼和電話號碼。為 + 號保留了一個附加字元,它是國家/地區程式碼的字首。

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.