另一个StructuredProperty中的StructuredProperty。如何?

时间:2014-02-06 14:40:07

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

我有一个实体,其中包含可变数量的另一个实体(所以我使用的是结构化属性,重复= 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)包含重复属性(直接或间接)。”

那我怎么能绕过这个呢? 我真的需要这种灵活的结构。

提前非常感谢。

2 个答案:

答案 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中。