Django - 过滤查询集忽略空格

时间:2015-02-27 14:30:32

标签: regex django forms validation

我的模型包含电话号码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提供的验证允许我根据输入的数字类型进行验证(例如移动或地理)。

我理想的是

  1. 我的过滤器忽略用户在搜索查询中输入的空格,或者存储值中的任何空格。这甚至可能吗?
  2. UKPhoneNumberField提供的验证应用于其他字段类型,而无需分析和重写所提供的所有正则表达式。
  3. 其他一些英国电话号码验证我还没有找到!

3 个答案:

答案 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]+')