2010-02-07 5 views
6

Przy użyciu pakietu SDK aplikacji Google App Engine i języka Python napotykam problem: nie mogę uzyskać dostępu do właściwości ID danej właściwości obiektu. Jedyne właściwości mam dostępu są zdefiniowane w klasie modelu, a także właściwość klucza (patrz odpowiedź poniżej):Nie można uzyskać dostępu do właściwości ID z jednostki magazynu danych

class Question(db.Model): 
    text = db.StringProperty() 
    answers = db.StringListProperty() 
    user = db.UserProperty() 
    datetime = db.DateTimeProperty() 

mogę uzyskać dostęp do tekstu, odpowiedzi, użytkownik, datetime i kluczowych właściwości dobrze. Nie mogę jednak uzyskać dostępu do właściwości ID. Na przykład po pobraniu wszystkich podmiotów (za pomocą Question.all()):

# OK Within a template, this will return a string : 
{{ question.text }} 
# OK, this will return the entity key : 
{{ question.key }} 

# KO this will return nothing : 
{{ question.id }} 

pomysłów? Dzięki !

+0

Klucz i identyfikator nie są właściwościami encji Datastore. key() jest metodą instancji, a id() jest metodą instancji klucza. {{entity.key.id}} działa tylko dlatego, że bit po. będą interpretowane jako wywołanie metody, gdy będzie to właściwe. – geoffspear

Odpowiedz

10

Zgodnie z documentation, nie ma metody instancji id() zdefiniowanej dla podklas Model.

Zamiast tego spróbuj .

Należy również pamiętać, że klucz nie zostanie utworzony, dopóki jednostka nie zostanie zapisana w magazynie danych.


Edycja: Więcej informacji na podstawie OP EDIT:

Ponieważ jesteśmy naprawdę po numeryczny identyfikator, moglibyśmy zrobić coś takiego w naszym szablonie:

{{ question.key.id }}

Inna uwaga: nigdy nie powinieneś oczekiwać, że wartości liczbowe wzrosną w wartości odpowiadającej kolejności tworzenia jednostki. W praktyce jest to zazwyczaj - ale nie zawsze - przypadek.

+0

Rzeczywiście, {{question.key}} działa poprawnie i zwraca klucz zapisany w Datastore. Powinienem dwukrotnie sprawdzić! Mogę edytować mój pierwotny wpis. Domyślam się, że odzyskanie identyfikatora to jedyny problem. – jbmusso

+0

dzięki za szybkie odpowiedzi, rozwiązali moje problemy doskonale! – jbmusso

+0

@Sorw: Anytime. Witamy w SO. – bernie

5

Właśnie znalazłem możliwe (nieeleganckie, IMO) rozwiązanie. Po zapytań i pobierania podmioty, pętlę przez wszystkie z nich i ręcznie dodać parametr id:

query = Question.all() 
questions = query.fetch(10) 

# Add ID property : 
for question in questions: 
    question.id = str(question.key().id()) 

Nie sądzę, że to wydajne CPU mądry, ale działa jako szybki/brudnej poprawki.

+0

@Sorwacja: nie musisz tego robić. Zobacz moją zredagowaną odpowiedź. – bernie

+0

@Adam: hehe Myślę, że obaj znaleźliśmy możliwe rozwiązanie w tym samym czasie, ale twoje jest dużo prostsze! – jbmusso

+0

Nieelegancka, być może, ale +1 do ciebie za przybycie na rozwiązanie. – bernie