Запрос Google App Engine (не фильтр) для дочерних объектов - PullRequest
6 голосов
/ 09 февраля 2009

Доступны ли дочерние объекты в запросе?

Дано:

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 продуктов на общую сумму 250 000 продуктов. Есть ли способ сформировать ресурсоэффективный запрос, который вернет только 500 продуктов, произведенных одной конкретной фабрикой? Метод предка является фильтром, поэтому, например, используется Product.all (). Ancestor (factory_1) потребует повторных обращений к хранилищу данных.

1 Ответ

8 голосов
/ 13 февраля 2009

Хотя предок описывается как «фильтр», он на самом деле просто обновляет запрос, чтобы добавить условие предка. Вы не отправляете запрос в хранилище данных, пока не выполните итерацию запроса, поэтому все, что у вас есть, будет работать нормально.

Один незначительный момент: 500 объектов с одним и тем же родителем могут повредить масштабируемости, поскольку записи сериализуются для членов группы объектов. Если вы просто хотите отследить фабрику, которая произвела продукт, используйте ReferenceProperty:

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

Затем вы можете получить все продукты, используя:

myFactory.products
...