2010-07-25 2 views
1

Я новичок в Google Apps, и я возился с приложением hello world, которое указано на сайте приложения Google. Как только я закончил приложение, я решил попытаться расширить его. Первое, что я добавил, это функция, позволяющая фильтровать сообщения гостевой книги пользователем, который их представил.Не удается получить доступ к элементам UserProperty в коде

Все, что я изменил/добавил, просто обработчик WSGIApplication и новый класс для этого обработчика. Модель же, я выложу для справки:

class Greeting(db.Model): 
    author = db.UserProperty() 
    content = db.StringProperty(multiline = True) 
    date = db.DateTimeProperty(auto_now_add=True) 

Использование шаблона Django Я изменил строку, выводящую авторы прозвище от:

<b>{{ greeting.author.nickname }}</b> wrote: 

к:

<a href="/authorposts/{{ greeting.author.user_id }}"> 
    {{ greeting.author.nickname }} 
</a></b> wrote: 

Проблема, с которой я сталкиваюсь, заключается в том, что внутри моего кода python я не могу получить доступ к «greeting.author.nickname» или любому другому свойству, например «user_id». Однако они доступны из шаблона Django, поскольку код, указанный выше для шаблона, работает и правильно создает ссылку на автора, а также показывает псевдоним.

Я использую сопоставление URL, основанное на свойстве авторов (UserProperty) «user_id». Я пытаюсь найти способ, чтобы я мог фильтровать хранилище данных, используя user_id в качестве критериев. Я попытался напрямую применить фильтр к запросу, я попытался вытащить все записи, а затем повторить их и использовать предложение If ... Else.

Я знаю, что значение хранится в хранилище данных, потому что шаблон Django показывает его, что мне нужно сделать, чтобы использовать его в качестве критериев фильтра?

+1

Как выглядит ваше мнение? – xj9

+0

Извините, я думал, что вы используете Django. Попробуйте создать экземпляр класса приветствия. – xj9

ответ

1

При запросе Greeting модели, вы не можете отфильтровать по полям вGreeting.author (например, greeting.author.nickname). В SQL это будет сделано путем объединения в таблицы Greeting и User. Однако в GAE вы можете запрашивать свойства, непосредственно включенные в модель, которую вы запрашиваете.

Поскольку author является db.UserProperty, вы можете фильтр пользователя, как это:

# fetch up to 10 greetings by the current user 
user = users.get_current_user() 
results = Greeting.all().filter('author =', user).fetch(10) 

Для фильтрации на других полях вauthor, Вы должны были бы денормализовать вашу Greeting модель - то есть, добавить копии полей в author, которые вы хотите, чтобы иметь возможность фильтровать Greeting. Например, если вы хотите, чтобы фильтровать по author.nickname, вы бы добавить author_nickname поля для вашей Greeting модели (и сохраните свое значение до настоящего времени с author.nickname):

class Greeting(db.Model): 
    author = db.UserProperty() 
    author_nickname = db.StringProperty() # denormalization (copy of author.nickname) 
    content = db.StringProperty(multiline = True) 
    date = db.DateTimeProperty(auto_now_add=True) 

Если добавить этот вид денормализации к вашей модели , полезно было бы использовать от Nick Johnson, чтобы обновлять author_nickname всякий раз, когда обновляется author (просто вам не нужно вручную применять эти отношения).

+0

Проблема с моим первым примером заключается в том, что я пытаюсь отфильтровать с помощью user_id, однако я не зарегистрирован как этот пользователь. Есть ли способ создать объект пользователя с идентификатором, с которым я пытаюсь отфильтровать? Что касается вашего второго примера, я рассмотрел этот маршрут, и если это единственный метод, который работает, то это то, что я буду реализовывать, и я проверю эту библиотеку, поскольку что-то говорит мне, что если у людей есть созданных библиотек с функциональными возможностями согласования денормализованных данных, вероятно, это единственный метод на данный момент. – Timbermar

+0

Похоже, что для получения требуемой функциональности потребуется денормализация. Вы также можете добавить 'user_id' в модель« Приветствие ». –

+0

Да, я думаю, что это будет метод, который я использую, я не нашел ничего другого, что могло бы дать эту функциональность. Благодаря! – Timbermar

Смежные вопросы