2017-04-10 1 views
0

Ich habe mehrere Klassen, für die ich spezielle Funktionen haben, die NDB in einem kürzeren Weg, wie in diesem Beispiel abfragen:Wie kann ich Funktionen erstellen, die für verschiedene Modellklassen in GAE funktionieren?

class SomeModel(ndb.Model): 
    xcode = ndb.StringProperty('c') 
    descr = ndb.StringProperty('d') 
    client = ndb.KeyProperty('cl') 
    order = ndb.IntegerProperty('o') 
    mod = ndb.DateTimeProperty(auto_now=True) 

    @classmethod 
    def q_base(cls, ancestor): 
     return cls.query(ancestor=ancestor).order(cls.codigo) 

Die Funktion q_base etwas Platz spart und macht den Code in den Handler klarer sehen. Aber da einige Modelle genau diese Funktion benötigen, muss ich sie mehrmals wiederholen, was ein Problem darstellt.

Wie kann ich es lösen? Kann ich einfach eine BaseClass (ndb.Model) erstellen, die Funktionen dort hinzufügen und jedes andere Modell davon erben lassen? Oder muss ich PolyModel dafür verwenden? Wie würde das aussehen? Außerdem würde ich mich über jeden Einblick freuen, was mit irgendwelchen existierenden Entitäten passieren würde.

Antwort

1

Ich habe keine Erfahrung mit GAE aber es sei denn, sie einige sehr seltsame Dinge tun, würde die kanonische Lösung von ndb.Model vererben verwenden entweder eine abstrakte Basisklasse sein - wenn ndb unterstützt abstrakte Modellklassen - oder eine mixin:

class QBaseMixin(object): 
    @classmethod 
    def q_base(cls, ancestor): 
     return cls.query(ancestor=ancestor).order(cls.codigo) 


class MyModel(ndb.Model, QBaseMixin): 
    # model code here 
+0

Während mehrfache Vererbung die Verwendung des PolyModel erfordern würde, funktioniert es, wenn ich einfach eine BaseClass erstelle, die von ndb.Model erbt und dann die anderen Klassen von dieser Basisklasse erben lasse. Bis jetzt funktioniert alles wie erwartet, danke! –

Verwandte Themen