StructuredProperty和StringProperty的问题

时间:2015-08-04 20:11:50

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

我正在Google App Engine中完成最终学位课程,但是当我尝试这个时我遇到了问题:

class Predicate(ndb.Model):
    name = ndb.StringProperty()
    parameters = ndb.JsonProperty()

class State(ndb.Model):
    predicates = ndb.StructuredProperty(Predicate, repeated=True)

class Action(ndb.Model):
    name = ndb.StringProperty()
    parameters = ndb.StringProperty(repeated=True)
    preconditions = ndb.StructuredProperty(Predicate, repeated=True)
    predicatesToAdd = ndb.StructuredProperty(Predicate, repeated=True)
    predicatesToDel = ndb.StructuredProperty(Predicate, repeated=True)

class Plan(ndb.Model):
    plan = ndb.StructuredProperty(Predicate, repeated=True)

class Problem(ndb.Model):
    initialState = ndb.StructuredProperty(Predicate)
    goalState = ndb.StructuredProperty(Predicate)
    actions = ndb.StructuredProperty(Action, repeated=True)

我收到此错误:

TypeError: This StructuredProperty cannot use repeated=True because its model class (Predicate) contains repeated properties (directly or indirectly).

StructuredProperty,如果它包含重复,则无法复制另一个StructuredProperty。但我需要这种结构模型。我该如何解决这个问题?

抱歉我的英语不好:(

我使用LocalStructuredProperty解决了这个问题,但我认为它根本不起作用

1 个答案:

答案 0 :(得分:1)

您的设计存在的问题是ndb不允许嵌套的重复属性。换句话说,您不能拥有重复的结构化属性,而后者又具有自己的重复属性。如果从parameters属性中删除repeated = True,它将起作用。

您需要重新考虑您的设计才能解决这个问题。一种可能的解决方案可能是使用JsonProperty作为参数,并将字符串列表存储为JSON字符串。当然,您无法查询它们,但可能会根据您的要求进行查询。