在 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 个字符包括国家/地区代码和电话号码。为 + 号保留了一个附加字符,它是国家/地区代码的前缀。