2010-06-15 9 views
16

mógłbym użyć trochę pomoc w AppEngine ziemi ...Pobieranie tylko klucz/id z ReferenceProperty w App Engine

Używanie [Python] API tworzę relacje jak w poniższym przykładzie z docs:

class Author(db.Model): 
    name = db.StringProperty() 

class Story(db.Model): 
    author = db.ReferenceProperty(Author) 

story = db.get(story_key) 
author_name = story.author.name 

Jak rozumiem, ten przykład spowoduje utworzenie dwóch zapytań dotyczących datastore. Jeden, aby pobrać Historię, a następnie jeden, aby wyrazić szacunek Autorowi, aby uzyskać dostęp do nazwiska. Ale chcę, aby móc pobrać identyfikator, więc zrobić coś takiego:

story = db.get(story_key) 
author_id = story.author.key().id() 

Chcę tylko uzyskać identyfikator z odniesienia. Nie chcę mieć do szacunku (w związku z tym zapytaj datastore) o wartość ReferenceProperty.

Od czytanie dokumentacji jest napisane, że

gdy wartość ReferenceProperty jest klucz

Co prowadzi mnie do myślenia, że ​​może po prostu zadzwonić .id() na wartości odniesienia za. Ale jest również napisane:

Model ReferenceProperty udostępnia funkcje dla wartości właściwości Key, takich jak automatyczne dereferencje.

Nie mogę znaleźć niczego, co wyjaśnia gdy to bazowanie odbywa?
Czy można bezpiecznie wywołać funkcję .id() w wartości ReferenceProperty?
Czy można założyć, że wywołanie funkcji .id() nie spowoduje wyszukiwania w bazie danych?

+0

See [ReferenceProperty: .get_value_for_datastore() -> .get_key() - Google Groups] (https://groups.google.com/forum/#!topic/google-appengine -python/Ai90diACDiA) – Pat

Odpowiedz

26

Odpowiadając na moje własne pytanie dla dobra pomagając kolegom poszukiwaczy ...

Jak podejrzewa nazywając story.author.key(). Id() lub nawet story.author.id() spowoduje zapytań Datastore . Poprawna metoda dictated by the API docs jest:

story = db.get(story_key) 
author_id = Story.author.get_value_for_datastore(story).id()