【问题标题】:Optional reference field in app engine datastore应用引擎数据存储区中的可选参考字段
【发布时间】:2018-10-21 06:41:37
【问题描述】:

我有模特

class MyModel(ndb.Model):
    foo = ndb.StringProperty()

class OtherModel(ndb.Model):
    baz = ndb.StringProperty()
    ref = ndb.KeyProperty(kind=MyModel)

我构建了一个视图,可以在其中创建和修改这些模型实体,我希望 OtherModelref 字段是可选的,但是当我尝试提交并清空 ref 字段或删除旧值时我收到ndb.KeyProperty 的验证错误

我的更新逻辑如下:

for property in editableProperties:
    # Lets suppose this parses values from a form in a request to the needed type
    new_value = deserialize(property._kind, self.request.get(property._name))
    setattr(item, property._name, new_value)

我尝试将 new_value 设置为 None 和空字符串。我怎样才能做到这一点?

【问题讨论】:

  • 请附上完整的错误信息。此外,为调试目的尝试更简单的更新逻辑:item.ref = new_value

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


【解决方案1】:

如果您没有 Model 实体键来设置 ref 属性,请不要设置它 - 即不要将该属性包含在您要传回数据存储区进行写入的实体值中.如果你这样做了,你传递的属性值将接受健全性检查并且它们会失败。

换句话说:根本不做

`setattr(item, property._name, new_value)`

new_value 不是键时,对于ref。而是按照以下方式做一些事情:

if hasattr(item, property._name):
   delattr(item, property._name)

【讨论】:

  • 谢谢它按预期工作。我在任何地方都找不到这样的例子。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多