在 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.