我的模型包含电话号码external_number
,存储为字段:
models.py
class PhoneRecord(models.Model):
def __unicode__(self):
return "Call to %s (%s)" % (self.external_number, self.call_date.strftime("%c"))
INBOUND = "I"
OUTBOUND = "O"
DIRECTION_CHOICES = (
(INBOUND, "Inbound"),
(OUTBOUND, "Outbound"),
)
external_number = models.CharField(max_length=20)
call_date = models.DateTimeField()
external_id = models.CharField(max_length=20)
call_duration = models.TimeField()
call_direction = models.CharField(max_length=1, choices=DIRECTION_CHOICES, default=INBOUND)
call = models.FileField(upload_to='calls/%Y/%m/%d')
表单是使用https://github.com/g1smd/django-localflavor-UK-forms/blob/master/django/localflavor/uk/forms.py
中的UKPhoneNumberField
清理和存储数据
这意味着该号码以01234 567890格式存储在数据库中,即有空格。
我使用django-filters创建了一个过滤器,当搜索部分电话号码(除外)时,如果搜索字词不包含空格,则该过滤器无法正确过滤。即。
01234
会返回上面示例的记录567890
会返回上面示例的记录01234 567890
会返回上面示例的记录01234567890
不返回上述示例的记录现在,我可以将过滤器上的表单置于相同的限制之下(即UKPhoneNumberField
作为输入屏幕,但这样就无法搜索部分电话号码。
我还研究了使用类似django-phonenumber-field的东西控制模型和表格的可能性,但UKPhoneNumberField
提供的验证允许我根据输入的数字类型进行验证(例如移动或地理)。
我理想的是
UKPhoneNumberField
提供的验证应用于其他字段类型,而无需分析和重写所提供的所有正则表达式。答案 0 :(得分:0)
您可以设置过滤器来执行以下操作:
phone_number = "01234 567890"
parts = phone_number.split(" ")
PhoneRecord.objects.filter(
external_number__startswith="{} ".format(parts[0]),
external_number__endswith=" {}".format(parts[1]),
)
那样过滤器正在寻找具有空格的数字的前半部分,然后是空间的数字的后半部分。将返回的唯一记录是值为" 01234 567890"
答案 1 :(得分:0)
我最后添加了一个field_class = UKPhoneFilter
的自定义过滤器。这意味着我无法搜索部分号码,但这已从项目中删除。
答案 2 :(得分:0)
在将数据保存到数据库之前,您应该考虑规范化数据。 你可以使用django-phonenumber-field来做到这一点。
在解决您的问题时,您始终可以使用django的regex
字段后缀来查询正则表达式。
e.g。 MyModel.objects.filter(myfiel__regex=r'[a-Z]+')