【问题标题】:StructuredProperty inside another StructuredProperty. How to?另一个 StructuredProperty 中的 StructuredProperty。如何?
【发布时间】:2014-02-06 14:40:06
【问题描述】:

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

那么我该如何绕过呢? 我真的需要这种灵活的结构。

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    虽然 StructuredProperty 可以重复,但 StructuredProperty 可以包含另一个结构化属性,请注意:如果一个结构化属性 属性包含另一个,只能重复其中一个。一种 解决方法是使用 LocalStructuredProperty,它没有 此约束(但不允许查询其属性值)。

    https://developers.google.com/appengine/docs/python/ndb/properties#structured

    使用 LocalStructuredProperty,您将拥有相同的结构,但您将无法按此属性进行过滤。如果您确实需要通过其中一个属性进行查询,请尝试将其放入另一个实体中。

    【讨论】:

      【解决方案2】:

      您不能将重复的 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
      

      其他选项:如果您需要交易,您可以将 Hotel 作为 SpecialProperty 和 Property 的父级。

      其他选项:如果您不需要查询属性,可以将其存储在 JSONProperty 中。

      【讨论】:

      • 这是一个很棒的广告。谢谢!但我会在这个项目中使用 LocalStructuredProperty
      • 欢迎回到关系数据库。我看到的是应用引擎不支持超过 1 级的嵌套属性。我建议人们首先设计模型关系以避免这种约束。
      • @MaxTsepkov 如果您无法查询重复的子对象值,那么您的观察似乎基本上是正确的。最好找到一个关于这个主题的更长的讨论。不幸的是,我发现都是对琐碎例子的讨论。也许我们需要的是 Google ZopeEngine!
      • @MaxTsepkov 那么如何使用关系数据库创建嵌套的结构化属性呢?我也觉得不可能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      相关资源
      最近更新 更多