2012-03-17 5 views
0

Django/Python новичок здесь.django - фильтр на модель представление по умолчанию

Давайте использовать пример таблицы из Джанго книги на этой странице: http://www.djangobook.com/en/2.0/chapter10/

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

Вот заявление пример фильтр, используемый для доступа к автору таблицы:

a = Author.objects.get(first_name='Adrian', last_name='Holovaty') 

Что делать, если я не» t есть имя и фамилия в отдельных переменных? Что, если у меня будет только имя вместе? Я хотел бы сделать что-то вроде этого:

aName = 'Adrian Holovaty' 
a = Author.objects.get(Author.self=aName) 

Я ищу для доступа к этому представлению объекта как-то. Конечно, я мог бы разбить aName на пространство и выполнить поиск, как указано выше. Но что, если не так ясно, как разбить целое имя? Предположим, я пытался разбить что-то вроде «Нью-Йорк Никс» или «Рип Ван Винкль»? В первом примере first_name будет «Нью-Йорк», а во втором это будет просто «Rip».

+1

Итак ... на какой вопрос вы спрашиваете? –

+0

Я хотел бы получить доступ к __unicode __ (self) «property» внутри фильтра или попасть в таблицу. – Cromulent

ответ

1

Причина, по которой вы не можете сделать это, заключается в том, что __unicode__ оценивается в Python, с использованием данных, выбранных SQL-запросом.

Таким образом, база данных не может предсказать значение, сгенерированное методом Python __unicode__.

Тем не менее, есть много способов:

  1. , если вы полагаетесь на django-haystack для поиска, то вы можете поставить {{ object }}, который является результатом object.__unicode__ в шаблоне класса модели. Затем вы можете включить поиск по __unicode__ выводам.

  2. добавить cached_unicode CharField модели, используйте pre_save signal receiver (переопределить save() method), чтобы обновить self.cached_unicode, то вы можете фильтровать (cached_unicode = 'Foo Bar')

  3. использование SQL CONTACT (author.first_name , '', author.last_name) = 'Foo Bar' либо с Author.objects.raw() либо с author_queryset.extra()

+0

Вздох. Должен быть более простой способ. Я бы * действительно * хотел быть в состоянии сделать "a = Author.objects.get (first_name + last_name = 'Adrian Holovaty')", но это приводит к ошибке «ключевого слова». – Cromulent

+0

С какими «авторами» вы имеете дело? Вы можете разделить строку запроса на пробелы и выполнить несколько поисков для каждого из возможных имен. Для этих 'Authors', которые соответствуют, проверьте, соответствует ли представление' __unicode__' полному имени запроса. Это не так хорошо, как поиск в одной базе данных, но для ваших целей это может быть хорошо и достаточно быстро. –

+0

Я думал, что вы просите общий способ ... Поэтому я добавил два решения, которые работают, если вы знаете, как __unicode__ строит заранее (т. Е. Вы знаете, что это конкатенация имени имени). Спасибо за ваш отзыв! – jpic

0

Просто добавьте getbyname метод в классе, который расщепляет имя и peforms запрос. Работа выполнена.

+0

Но как вы разделите имя, если вы не знаете, где *, чтобы разбить имя?Кроме того, у меня возникли проблемы с поиском «getbyname». – Cromulent

+0

@Cromulent Вы не найдете его, пока не напишете его. Что касается расщепления, то это для вас дизайн. – Marcin