代码之家  ›  专栏  ›  技术社区  ›  Thomas L Holaday

用于实体子代的Google应用程序引擎查询(非筛选器)

  •  6
  • Thomas L Holaday  · 技术社区  · 16 年前

    查询中实体的子级是否可用?

    鉴于:

    class Factory(db.Model):
        """ Parent-kind """
        name = db.StringProperty()
    
    class Product(db.Model):
        """ Child kind, use Product(parent=factory) to make """
        @property
        def factory(self):
            return self.parent()
        serial = db.IntegerProperty()
    

    假设有500家工厂生产了500种产品,总计25万种产品。有没有一种方法可以形成一个资源高效的查询,只返回一个特定工厂生产的500种产品?Ancestor方法是一个过滤器,因此使用例如product.all().Ancestor(Factory_1)将需要重复调用数据存储。

    1 回复  |  直到 12 年前
        1
  •  8
  •   mcobrien    16 年前

    尽管祖先被描述为一个“过滤器”,但它实际上只是更新查询以添加祖先条件。在对查询进行迭代之前,不会向数据存储发送请求,因此您所拥有的将可以正常工作。

    不过,还有一个小问题:500个具有相同父级的实体可能会损害可伸缩性,因为写入操作被序列化到实体组的成员。如果只想跟踪生产产品的工厂,请使用引用属性:

    class Product(db.Model):
       factory = db.ReferenceProperty(Factory, collection_name="products")
    

    然后,您可以使用以下方法获得所有产品:

    myFactory.products