Как вам Django Query фильтровать через обработанный столбец Model? - PullRequest
1 голос
/ 03 марта 2010

У меня есть следующая модель:

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 ]

1 голос
/ 03 марта 2010

Эта проблема очень похожа на обработку относительных дат. По сути, вам нужно иметь два поля: одно для отображения пользователя (123) -456-789 независимо от другого и одно для внутреннего использования, раздетое и очищенное до 12345678. Тогда запрос любого числа не проблема, __contains должно работать просто право.

Да - это вдвое больше данных (хотя для номера телефона я думаю, что это незначительно), но оно того стоит.

0 голосов
/ 03 марта 2010

Я думаю, что лучший способ сделать это - использовать объект 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))

Должны быть возвращены все исполнители, у которых есть сотовый или PR номер телефона, соответствующий input_phone.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...