Каков наилучший способ установить вычисляемое свойство модели ядра приложения в appengine после выборки из хранилища данных? - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть своя модель User в движке приложения, которая должна иметь свойство его граватарского URL. Однако, поскольку это может быть очень быстро вычислено с использованием его адреса электронной почты, не имеет смысла хранить его. Есть ли способ просто автоматически инициализировать это свойство при его загрузке из хранилища данных?

Я мог бы просто добавить метод get_avatar_url (), но вы не можете вызывать методы объекта (насколько я знаю) из шаблона jinja2, и я не хочу публиковать все эти значения по отдельности в шаблон.

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Вы можете определить метод, как вы описываете, или вы можете определить свойство, например:

class MyModel(db.Model):
  email = db.StringProperty(required=True)

  @property
  def avatar_url(self):
    return "http://gravatar.com/avatar/%s" % (hashlib.md5(self.email).hexdigest(),)

Затем вы можете ссылаться на это как instance.avatar_url (или в шаблоне, {{instance.avatar_url}}).

В шаблоне jinja2 любой из них будет работать нормально, но использование свойства немного удобнее, если вам нужно запросить его в другом месте.Так как только экземпляры свойств хранилища данных приводят к хранению данных в хранилище данных, ваше свойство не будет храниться в хранилище данных.

0 голосов
/ 11 декабря 2011

Можно вызывать их из шаблона. Все, что вам нужно сделать, это объявить метод этой модели как classmethod или свойство

Вот краткий пример:

# sample model
class UserProfile(db.Model):
    ...
    email = db.EmailProperty()
    ...

    @property
    def id(self):
        return self.key().id()

    @classmethod
    def get_avatar_url(self):
        # whatever you need to call gravatar url
        return self.email

# sample view
def show_user(user_id):
    user = User.all().filter("user = ", user_id).get()
    flowers = Flower.all().filter("user = ", user)
    return render_template('index.html', u=user, f=flowers)

# sample template
<div class="user">user id: {{ u.id }}, and gravatar: {{ u.get_gravatar_url() }}<div>

НТН.

0 голосов
/ 11 декабря 2011

Вы наверняка можете вызывать методы в шаблоне.Это лучший способ сделать это.

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