你如何通过处理过的Model列筛选Django Query?

时间:2010-03-02 21:40:22

标签: django

我有以下型号:

class Artist(models.Model):
    cell_phone = models.CharField(20)
    pr_phone = modelsCharField(20)

在我的模板中,我可以搜索输入的电话号码与手机或PR手机匹配的所有艺术家。假设最初输入的电话号码没有限制,那么电话号码可以采用以下任何格式存储:

123 456 7890
(123) 456-7890
123-456-7890

蛮力的方式是:

# variable input_phone has already been stripped of dashes, braces and spaces
all_artists = Artists.objects.all()
artists = []

for artist in all_artists:
    cell_phone = artist.cell_phone
    pr_phone = artist.pr_phone

    if cell_phone.find(input_phone) >= 0 or pr_phone.find(pr_phone) >= 0:
        artists.append(artist)

return artists

我正在使用find因为我还可以搜索所有居住在特定区号内的艺术家。有没有通过Django的查询过滤器的上述方法?

2 个答案:

答案 0 :(得分:1)

此问题与相对日期处理非常相似。基本上,你需要有两个字段:一个用于用户的显示(123)-456-789,一个用于内部使用,剥离并清理到12345678.然后查询任何数字都不是问题,__contains应该工作得恰到好处。

是的 - 这是双倍的数据量(虽然对于电话号码我认为可以忽略不计),但这完全是值得的。

答案 1 :(得分:0)

我认为最好的方法是使用django Q对象(http://docs.djangoproject.com/en/1.1/topics/db/queries/#complex-lookups-with-q-objects

所以我相信这段代码对你有用:

from django.db.models import Q
Artists.objects.filter(Q(cell_phone=input_phone) | Q(pr_phone=input_phone))

它应该返回所有拥有与input_phone匹配的手机或公共电话号码的艺术家。