flask ndb.model auto created_by 字段

flask ndb.model auto created_by field

我有一个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

有什么想法吗?

我建议您自己定义 属性 class:

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,因为用户属性会做很多奇怪的事情,所以处理您自己的用户实体总是更好。

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

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

但目前有效