Problemumgehung zum Zurückgeben einer Liste von einer ComputedProperty-Funktion in NDB
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?
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)