Frage

Ich konvertiere meine App, um NDB zu verwenden.Ich hatte früher so etwas:

@db.ComputedProperty
    def someComputedProperty(self, indexed=False):
      if not self.someCondition:
          return []
      src = self.someReferenceProperty
      list =  src.list1 + src.list2 + src.list3 + src.list4 \
              + [src.str1, src.str2]
      return map(lambda x:'' if not x else x.lower(), list) 

Wie Sie sehen, ist meine Methode zum Generieren der Liste etwas kompliziert, ich halte es lieber so.Aber als ich mit der Umstellung auf NDB begann, habe ich es einfach ersetzt @db.ComputedProperty von @model.ComputedProperty aber dann bekam ich diesen Fehler:

NotImplementedError: Property someComputedProperty does not support <type 'list'> types.

Ich konnte hineinsehen model.py in ext.ndb das ComputedProperty erbt von GenericProperty wo in der _db_set_value Es gibt mehrere if/else-Anweisungen, die Werte entsprechend ihrem Typ verarbeiten, mit der Ausnahme, dass es keine Behandlung für gibt lists

Derzeit durchläuft es die erste Bedingung und gibt diesen Fehler aus, wenn ich eine leere Liste zurückgebe.

Gibt es eine Möglichkeit, dies zu umgehen und den Fehler zu vermeiden?

War es hilfreich?

Lösung 2

Diese gesamte Funktionalität kann innerhalb einer Funktion ausgeführt werden, es muss also keine sein ComputedProperty.Verwenden Sie „Berechnete Eigenschaften“ nur, wenn Sie eine Berechnung durchführen möchten, die Sie möglicherweise abfragen möchten.A ComputedProperty kann es haben indexed Flag auf gesetzt False Dies bedeutet jedoch, dass Sie keine Abfragen durchführen und es daher nicht unbedingt als Eigenschaft haben müssen.

def someComputedProperty(self):
  if not self.someCondition:
      return []
  src = self.someReferenceProperty
  list =  src.list1 + src.list2 + src.list3 + src.list4 \
          + [src.str1, src.str2]
  return map(lambda x:'' if not x else x.lower(), list) 

Andere Tipps

Sie müssen das Flag „repeated=True“ für Ihre berechnete Eigenschaft in NDB setzen.Ich glaube nicht, dass Sie die nette Notation „@db.ComputedProperty“ verwenden können, Sie müssen sagen:

def _computeValue(self):
    ...same as before...
someComputedProperty = ComputedProperty(_computeValue, repeated=True, indexed=False)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top