Google app engine 什么';从数据存储中提取后,在appengine中设置appengine模型的计算属性的最佳方法是什么?

Google app engine 什么';从数据存储中提取后,在appengine中设置appengine模型的计算属性的最佳方法是什么?,google-app-engine,model,Google App Engine,Model,我在appengine中有自己的用户模型,应该有他的gravatarurl属性。然而,由于可以使用他的电子邮件地址非常快速地计算出这个值,所以存储它是没有意义的。是否有一种方法可以在从数据存储加载此属性时自动初始化它 我可以只添加一个名为get_avatar_url()的方法,但您不能从jinja2模板中调用对象的方法(据我所知),我不想将所有这些值单独发布到模板中。您肯定可以在模板中调用方法。这是最好的办法 您当然可以在模板中调用方法。这是最好的办法 可以从模板中调用它们。您只需将此模型的方法

我在appengine中有自己的用户模型,应该有他的gravatarurl属性。然而,由于可以使用他的电子邮件地址非常快速地计算出这个值,所以存储它是没有意义的。是否有一种方法可以在从数据存储加载此属性时自动初始化它


我可以只添加一个名为get_avatar_url()的方法,但您不能从jinja2模板中调用对象的方法(据我所知),我不想将所有这些值单独发布到模板中。

您肯定可以在模板中调用方法。这是最好的办法

您当然可以在模板中调用方法。这是最好的办法

可以从模板中调用它们。您只需将此模型的方法声明为或

下面是一个简单的例子:

# 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>
#示例模型
类用户配置文件(db.Model):
...
email=db.EmailProperty()
...
@财产
def id(自身):
返回self.key().id()
@类方法
def get_avatar_url(自我):
#无论您需要调用gravatar url
返回self.email
#示例视图
def显示用户(用户id):
user=user.all().filter(“user=,user_id).get()
flowers=Flower.all().filter(“user=,user”)
返回呈现模板('index.html',u=user,f=flowers)
#样本模板
用户id:{{u.id}}和gravatar:{{u.get_gravatar_url()}

HTH.

可以从模板调用它们。您只需将此模型的方法声明为或

下面是一个简单的例子:

# 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>
#示例模型
类用户配置文件(db.Model):
...
email=db.EmailProperty()
...
@财产
def id(自身):
返回self.key().id()
@类方法
def get_avatar_url(自我):
#无论您需要调用gravatar url
返回self.email
#示例视图
def显示用户(用户id):
user=user.all().filter(“user=,user_id).get()
flowers=Flower.all().filter(“user=,user”)
返回呈现模板('index.html',u=user,f=flowers)
#样本模板
用户id:{{u.id}}和gravatar:{{u.get_gravatar_url()}

HTH.

您可以定义所描述的方法,也可以定义属性,如下所示:

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\u url
(或者在模板中,
{{instance.avatar\u url}}


这两种方法都可以在jinja2模板中正常工作,但如果需要在其他地方请求,则使用属性会稍微整洁一些。由于只有数据存储属性实例会将数据存储在数据存储中,因此您的属性不会存储在数据存储中。

您可以定义所描述的方法,也可以定义属性,如下所示:

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\u url
(或者在模板中,
{{instance.avatar\u url}}


这两种方法都可以在jinja2模板中正常工作,但如果需要在其他地方请求,则使用属性会稍微整洁一些。由于只有数据存储属性实例会导致在数据存储中存储数据,因此您的属性不会存储在数据存储中。

对不起,这是胡说八道。不能在类方法中引用self。没有理由定义一个属性,你可以正常地调用一个方法。@DanielRoseman我知道会有“cls”作为参数(按惯例)而不是“self”。但它在我需要的时候起作用。定义属性的原因是我太聪明了,懒得在模板中写1000次“u.key().id()”;-)不,说真的,这不管用。classmethod根本不能引用实例,这就是为什么它是classmethod
get\u avatar\u url
如果需要从实例中获取信息,则不能作为classmethod。抱歉,这是胡说八道。不能在类方法中引用self。没有理由定义一个属性,你可以正常地调用一个方法。@DanielRoseman我知道会有“cls”作为参数(按惯例)而不是“self”。但它在我需要的时候起作用。定义属性的原因是我太聪明了,懒得在模板中写1000次“u.key().id()”;-)不,说真的,这不管用。classmethod根本不能引用实例,这就是为什么它是classmethod
get\u avatar\u url
如果需要从实例获取信息,那么它就不能是classmethod。