2013-02-18 16 views
10

To dotyczy ndb w Google App Engine. Zgodnie z moimi spostrzeżeniami, jeśli utworzę obiekt bez dostarczania jakiegokolwiek klucza, jednostka będzie miała liczbę całkowitą, zaczynając od 1 i będącą przyrostową, w polu ID, jak pokazano w Datastore Viewer. Jeśli jednak utworzę obiekt, podając ciąg jako jego identyfikator, jednostka będzie miała łańcuch w polu Key Name. Na przykład:Ndb wyszukiwarki aplikacji Google: używając identyfikatora lub nazwy klucza?

Model:

class Member(ndb.Model): 
    ... 

Program:

member1 = Member()   # --> ID is 1, Key Name is None 
member2 = Member(id='abc') # --> ID is empty, Key Name is 'abc' 

Ponadto w pliku html, jeśli mogę użyć

<input ... name="id" value={{member1.key.id}} ... /> 

jako parametr aby wrócić do program po stronie serwera (Python), żadna z następujących dwóch instrukcji nie zadziała dla członka 1:

Member.get_by_id(self.request.get('id')) 
member1 = Member.get_by_id(int(self.request.get('id'))) 

Jednakże następujące kody HTML i programowe:

<input ... name="id" value={{member2.key.id}} ... /> 
member2 = Member.get_by_id(self.request.get('id')) 

będą pracować dla member2.

Wydaje się, że nie ma problemu z elementami utworzonymi przez podanie identyfikatorów ciągu (tj. Element2). Ale to samo nie działa dla członka1. Moje pytania: a) Czy moje obserwacje są poprawne? b) Jak mogę pobrać member1 używając get_by_id()?

+0

Czy pobrane wszystkich Członków i zbadano ich klucze abyście wiedzieli 1. że faktycznie zapisałeś member1 i member2? i –

+0

2. jakie klucze rzeczywiście stworzyłeś –

Odpowiedz

13

a) W większości poprawne, ale powinieneś być w stanie uzyskać member1 poprzez drugą metodę, którą pokazałeś. Nie można również zweryfikować, czy identyfikatory całkowite zawsze zaczynają się od 1 i zawsze będą przyrostowe. Widziałem mieszane wyniki w odniesieniu do tego.

b) member1 = Member.get_by_id(int(self.request.get('id'))) powinien działać

Można również spróbować użyć key.urlsafe() więc nie musisz się martwić o kluczowych konwersji ID:

<input ... name="id" value={{member.key.urlsafe()}} ... />

member_key = self.request.get('id') 
member = ndb.Key(urlsafe=member_key).get() 
+3

Dzięki za potwierdzenie niektórych moich obserwacji. Po kolejnych eksperymentach mam następujący wniosek. Jeśli jednostka jest tworzona bez id (np. 'Member1 = Member()'), to jej identyfikator jest liczbą całkowitą i może zostać pobrany przez 'member1 = Member.get_by_id (int (self.request.get ('id'))) '. Jeśli jednak jednostka jest tworzona z id (np. 'Member2 = Member (id = 'abc')'), to jego Key Name to 'abc', i może zostać pobrana przez 'member2 = Member.get_by_id (self .request.get ('id')) '. Oba używają tych samych zmiennych szablonu w HTML: '{{member1.key.id}} i {{member2.key.id}}' –

+0

Czy jest bezpiecznie przekonwertować długą liczbę z allocate_id na int? Czy będzie można obcinać liczbę całkowitą w konwersji? – ccsakuweb

+0

+1 za sugestię Urlsafe, naprawił problem dla mnie! :) –

Powiązane problemy