1

我正在尝试做:

MyModel({'text': db.Text('text longer than 500 byets')})

但是得到:

BadValueError: Indexed value fb_education must be at most 500 bytes

我认为这只是旧 db api 这个问题的遗留问题。

https://groups.google.com/forum/?fromgroups#!topic/google-appengine/wLAwrjtsuks

4

5 回答 5

5

首先动态创建实体:

 kindOfEntity = "MyTable"
class DynamicEntity(ndb.Expando):
     @classmethod
     def _get_kind(cls):
        return kindOfEntity

然后在分配文本属性运行时间/动态之后,如下所示

dbObject = DynamicEntity()
key = "studentName"
value = "Vijay Kumbhani"
textProperties = ndb.TextProperty(key)
dbObject._properties[key] = {}
dbObject._values[key] = {}
dbObject._properties[key] = textProperties 
dbObject._values[key] = value
dbObject.put()

然后在关键属性分配文本属性之后

于 2013-11-27T04:34:04.063 回答
1

是的,我知道问题已经过时了。但我也搜索了相同的解决方案,但没有找到任何结果。所以这里收据对我有用(我用“权限”属性扩展了 User()):

prop = ndb.GenericProperty("permissions", indexed=False)
prop._code_name = "permissions"
user._properties["permissions"] = prop
prop._set_value(user, permissions)
于 2013-04-20T20:51:39.753 回答
1

以前的答案对我很有用...谢谢!!!我只是想补充一点,您似乎还可以使用这种技术创建特定的属性类型(如果您知道要创建的数据类型)。稍后检索实体时,动态属性将设置为特定类型,而不是 GenericProperty。这对于 ndb.PickleProperty 和 ndb.JsonProperty 值特别方便(以获得输入/输出转换)。

prop = ndb.TextProperty("permissions", indexed=False)
prop._code_name = "permissions"
user._properties["permissions"] = prop
prop._set_value(user, permissions)
于 2013-07-28T01:58:05.013 回答
1

我试图将实体的一个属性更改为文本。但是,当您没有明确映射您的属性时,Expando/Model 似乎会将实体的所有属性更改为 GenericProperty(在获取之后)。

当您再次放置这些实体(以更改所需的属性)时,它会影响其他现有的 TextProperties,然后更改为常规字符串。

只有低级数据存储 api 似乎工作:

https://gist.github.com/feroult/75b9ab32b463fe7f9e8a

您可以从 remote_api_shell.py 调用它:

from yawp import *
yawp(kind).migrate(20, 'change_property_to_text', 'property_name')
于 2015-01-13T11:16:32.707 回答
1

您正在尝试db.Text将旧 API 的一部分与 NDB 一起使用,但这是行不通的。

Expando据我所知,目前没有在 NDB中设置未索引属性的好方法。您可以设置_default_indexed = False您的 expando 子类,如此处(简要)记录那样,但这将使所有 expando 属性的默认值都没有索引。

更好的解决方案是避免一起使用Expando;它的引人注目的用途相对较少,通过定义模型(甚至动态定义模型)不会更好地为您服务。

于 2012-05-23T01:38:18.423 回答