0

Ich habe eine Eigenschaft mit dem obigen Code, die (und tut) soll ein int zurückgeben. (Ich setze den Int Casting drauf um es zu überprüfen) Aber wenn ich versuche es zu benutzen, cls.query().order(cls.returns_an_int) bekomme ich eine Fehlermeldung TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - Ich habe versucht mit + oder - zu sehen, ob ich es einen Wert bekommen kann, weil Ich habe es in anderen Fragen gesehen, aber es hat nicht funktioniert. Was mache ich falsch? Fehle ich etwas Grundlegendes, damit es funktioniert?AppEngine Python NDB-Typ Fehler bei .order()

Antwort

3

Wenn Sie den Datenspeicher abfragen, müssen Sie einen der verschiedenen Werte ndb.Property types abfragen. Sie fragen nach einer Vanilla-Python-Eigenschaft. Dies funktioniert nicht, da die Python-Eigenschaftsdaten niemals im Datenspeicher gespeichert werden und der Datenspeicher daher nicht nach Daten sortieren kann, die er nicht kennt.

Es ist schwer, einen endgültigen Ratschlag zu geben, wie man das beheben kann. Sie können Ihre Anfrage ohne .order und sortieren in Client-Code tun:

return sorted(cls.query(), key=lambda item: item.returns_an_int) 

aber das wird für Entitätstypen nicht arbeiten, die viele von Entitäten haben. Sie können auch Ihre Immobilie zu einem ndb.ComputedProperty ändern:

@ndb.ComputedProperty 
def returns_an_int(self): 
    some_var = do_something_that_returns_int() 
    if some_var: 
     return int(some_var) 
    else: 
     return 0 

Der Nachteil hierbei ist, dass Sie (und Bezahlung) mehr Datenspeicher Daten sind zu speichern und Sie auch die returns_an_int Methode für jeden Datenspeicher Put auszuführen. Wenn es eine schnelle Methode ist, die ausgeführt werden sollte, sollte das kein Problem sein, aber wenn es eine langsame Methode ist, könnten Sie den Unterschied bemerken.

+0

Vielen Dank! Ich werde wahrscheinlich am Ende meine Modelle ändern. – Rudi