我有一个实体,其中包含可变数量的另一个实体(所以我使用的是结构化属性,重复= True),但是这个属性也可以包含可变数量的单个实体类型。所以我的代码看起来像这样:
class Property(ndb.Model):
name = ndb.StringProperty()
cost = ndb.FloatProperty()
type = ndb.StringProperty()
class SpecialProperty(ndb.Model):
name = ndb.StringProperty()
properties = ndb.StructuredProperty(Property, repeated=True)
type = ndb.StringProperty()
class Hotel(ndb.Model):
specialProperties = ndb.StructuredProperty(SpecialProperty, repeated=True)
但是当我尝试这个GAE时会抛出一个错误。 “TypeError:此StructuredProperty不能使用repeated = True,因为其模型类(SpecialProperty)包含重复属性(直接或间接)。”
那我怎么能绕过这个呢? 我真的需要这种灵活的结构。
提前非常感谢。
答案 0 :(得分:7)
虽然可以重复StructuredProperty和StructuredProperty 可以包含另一个StructuredProperty,请注意:如果一个结构化 属性包含另一个,其中只有一个可以重复。一个 解决方法是使用没有的LocalStructuredProperty 这个约束(但不允许查询其属性值)。
https://developers.google.com/appengine/docs/python/ndb/properties#structured
使用LocalStructuredProperty,您将拥有相同的结构,但您将无法通过此属性进行过滤。如果您确实需要通过其中一个属性进行查询 - 请尝试将其放入另一个实体。
答案 1 :(得分:3)
您不能将重复的StructuredProperty放在另一个重复的StructuredProperty中。
您应该使用其他类型的关系(关联,祖先等)。例如:
class Property(ndb.Model):
name = ndb.StringProperty()
cost = ndb.FloatProperty()
type = ndb.StringProperty()
class SpecialProperty(ndb.Model):
hotel = ndb.KeyProperty(Hotel)
name = ndb.StringProperty()
properties = ndb.StructuredProperty(Property, repeated=True)
type = ndb.StringProperty()
class Hotel(ndb.Model):
# ... hotel properties
其他选项:如果您需要交易,您可以将SpecialProperty和Property的酒店父母。
其他选项:如果您不需要查询Property,可以将其存储在JSONProperty中。