2012-04-18 2 views
6

Скажем, у меня есть объекты а, Ь и с все того же типа, и ситуация такова:Как я могу запросить только прямых потомков?

объект а является родительским для объекта б объекта Ь родительским для объекта с

Теперь, если Я делаю следующий запрос:

query = ndb.Query(ancestor=a.key) 
result = query.fetch() 

Результат будет содержать как объекты b, так и c. Есть ли способ, по которому я могу отфильтровать c, чтобы остались только сущности, являющиеся прямыми потомками? В любом случае, кроме меня, я имею в виду результаты и их удаление.

ответ

4

Единственный способ сделать это - изменить вашу схему, добавив «родительский» KeyProperty, который ссылается на прямой родительский объект, а затем фильтрует его.

+4

отметить также, что результат запроса предка фактически будет также содержать (предполагая, что все они имеют один и тот же вид). Вы также можете иметь свойство «level» в каждом объекте, где корень имеет уровень 0, его прямые дети имеют уровень 1, их дети 2-го уровня и o. –

1

На самом деле, это не поддерживается вообще. Ответ Ник работает, но только если вы можете указать тип сущности в запросе, который OP не уточнил:

«Бесполезные запросы не могут включать фильтры по свойствам, но они могут фильтровать по ключу Entity, передавая Entity.KEY_RESERVED_PROPERTY как имя свойства фильтра. Также поддерживаются восходящие сортировки по Entity.KEY_RESERVED_PROPERTY. "

+0

Я использую ответ Ника, и он отлично работает. Однако мне пришлось перейти на поли модель. – sorin7486

+0

@ sorin7486 Итак, вы утверждаете, что вам удалось выполнить запрос предка, который включает в себя фильтр, но не включает этот вид? – moin

+0

Он содержит вид, только что это базовый вид. Все мои объекты - это разные типы страниц, и все они расширяют класс Page. – sorin7486

0

Это немного поздно, однако это поможет любому, у кого есть такая же проблема.

Решение состоит в том, чтобы сначала выполнить запрос только для ключей и взять подмножество ключей, которые являются прямыми потомками.

С помощью этого подмножества ключей вы можете пакетно получать желаемые объекты.

Я незнаком с питоном, так вот пример в ходе:

directDescKeys := make([]*datastore.Key, 0) 

q := datastore.NewQuery("A").Ancestor(parentKey).KeysOnly() 
for it := q.Run(ctx);; { 
    key, err := it.Next(nil) 
    if err == datastore.Done { 
     break 
    } else if err != nil { 
     // handle error 
    } 

    if reflect.DeepEquals(key.Parent(), parentKey) { 
     directDescKeys = append(directDescKeys, key) 
    } 
} 

entities := make([]*A, len(directDescKeys)) 
if err := datastore.GetMulti(ctx, directDescKeys, entities); err != nil { 
    // handle error 
}