flask ndb.model auto created_by field

时间:2015-03-24 10:00:20

标签: flask google-cloud-datastore app-engine-ndb

我有一个ndb.Model

class BaseModel(ndb.Model):
    created_on = ndb.DateTimeProperty(auto_now_add=True)
    created_by = ndb.KeyProperty(kind='MyUser') # ????

我正在寻找一种优雅的方式来创建一个自动“created_by”字段,该字段在创建时使用g.current_user键填充,以便

mymodel = BaseModel()

已经有created_on和created_by

任何想法?

2 个答案:

答案 0 :(得分:0)

我建议您定义自己的属性类:

class OwnerProperty(ndb.KeyProperty):

  _auto_current_user_add = False

  def __init__(self, auto_current_user_add=False):
    super(OwnerProperty, self).__init__(kind='MyUser')
    self._auto_current_user_add = auto_current_user_add

  def _prepare_for_put(self, entity):
    if self._auto_current_user_add and not self._has_value(entity):
      value = g.current_user.key
      if value is not None:
        self._store_value(entity, value)
    super(OwnerProperty, self)._prepare_for_put(entity)

我不确定你的g.current_user是如何设置的,但假设它是一个实体,这将有效。请注意,与ndb.DateTimeProperty类似,只有在第一次投放实体后,所有者才会被填充。

这是基于ndb.UserProperty is written的方式。但是,我建议不要直接使用UserProperty,因为用户属性会做很多奇怪的事情,因此处理自己的用户实体总是更好。

答案 1 :(得分:0)

最终做了一些简单的事情:

class BaseModel(ndb.Model):
    created_on = ndb.DateTimeProperty(auto_now_add=True)
    created_by = ndb.KeyProperty(kind='TalknetUser')

    def __init__(self, *args, **kwargs):
        super(BaseModel, self).__init__(parent=talknet_key(), *args, **kwargs)
        try:
            self.created_by = current_user.ndb.key
        except Exception as x:
            self.created_by = None

但到目前为止它有效