2013-05-31 14 views
14

Używam metody ndb to_dict, aby przekonwertować właściwości obiektu na python dict. Od wszystkiego, mogę powiedzieć, metoda ta nie obejmuje klucz obiektu lub dominującym w dict zgodnie z dokumentacją:Metoda ndb to_dict nie zawiera klucza obiektu

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

Jednak dla mojej sytuacji muszę kluczyk być w dict. Moją preferencją byłoby wykorzystanie metody wbudowanej i jej podklasy lub czegoś podobnego, zamiast tworzenia własnej metody to_dict.

Jaki jest najlepszy sposób na osiągnięcie tego celu lub czy brakuje mi czegoś oczywistego? Z góry dziękuję.

FYI: Nie używam django do tego projektu, ale zamiast tego prosto python jest wdrażany do gae.

Odpowiedz

29

Nie brakuje niczego ;-)

Wystarczy dodać klucz do słownika Po wywołaniu to_dict i tak zastąpić metodę.

Jeśli masz wiele modeli, które nie dzielą tej samej klasy bazowej z Twoim niestandardowym znakiem to_dict, zaimplementuję go jako mixin.

zdefiniować to_dict jako metodę klasy Mixin. Użytkownik będzie mógł następnie uzyskać:

class ModelUtils(object): 
    def to_dict(self): 
     result = super(ModelUtils,self).to_dict() 
     result['key'] = self.key.id() #get the key as a string 
     return result 

Następnie użyć.

class MyModel(ModelUtils,ndb.Model): 
    # some properties etc... 
+0

Dzięki Tim! Działa doskonale. Jestem nowy w python i nie wiem, jak zastąpić metodę, jak wspominasz. Mogę opublikować to jako kolejne pytanie, chyba że zechcesz edytować swoją odpowiedź i udzielić wskazówek. Doceniam szybką odpowiedź i cieszę się nauką od ciebie przez wszystkie twoje inne odpowiedzi tutaj na stosie. –

+0

Zobacz zmiany dla przykładu. –

+0

Danke sir. pomógł mi także –

2

Inny łatwy sposób osiągnąć (bez potrzeby zastąpić to_dict) jest dodanie ComputedProperty która zwraca ID, w taki sposób:

class MyModel(ndb.Model): 

    # this property always returns the value of self.key.id() 
    uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False) 

    # other properties ... 

ComputedProperty zostanie dodana do wyniku to_dict jak każda inna własność.

Istnieją tylko dwa ograniczenia:

  1. Podobno nazwa obiekt nie może być key (ponieważ byłoby sprzeczne z aktualnym kluczem) i id nie działa albo.
  2. To nie zadziała, jeśli nie określisz klucza lub id podczas tworzenia obiektu.

Ponadto obliczona wartość zostanie zapisana w magazynie danych po wywołaniu put(), więc zużyje część miejsca.

Zaletą jest to, że powoduje to nieoczekiwane pojawienie się argumentów include i exclude z to_dict().

+0

Nie wydaje się, aby to działało podczas początkowego tworzenia jednostki, ponieważ klucz nie został jeszcze zdefiniowany. Otrzymuję ten błąd: 'uid = ndb.ComputedProperty (lambda self: self.key.id()) AttributeError: Obiekt "NoneType" nie ma atrybutu "id" " – Stetzon

+0

Prawidłowo, to właśnie miałem na myśli przez ograniczenie # 2 w mojej odpowiedzi. Musisz przypisać klucz, gdy obiekt zostanie utworzony, aby to działało. Przynajmniej w moich przypadkach użycia nie stanowi to problemu. – Marten

+0

Tak, złapałem to prawie zaraz po tym, jak opublikowałem swój komentarz. Musiałeś przegapić twoją notatkę za pierwszym razem. Dziękuję za wyjaśnienie. Udało mi się go uruchomić, przypisując (przypisując i przypisując) (https://cloud.google.com/appengine/docs/python/ndb/creating-entity-keys#allocating_ids) klucz do obiektu przed początkowym _put_ – Stetzon

Powiązane problemy