0

Ist es möglich, einem Expando-Modell eine dynamische Entity-Art zuzuordnen? Zum Beispiel möchte ich für viele Arten von dynamischen Entitäten dieses Modell verwenden:GAE NDB Expando-Modell mit dynamischer Art

class Dynamic(ndb.Expando): 
    """ 
    Handles all "Post types", such as Pages, Posts, Users, Products, etc... 
    """ 
    col = ndb.StringProperty() 
    parent = ndb.IntegerProperty() 
    name = ndb.StringProperty() 
    slug = ndb.StringProperty() 

Im Moment benutze ich die „col“ StringProperty die Art (wie „Pages“, „Beiträge“, etc) und Abfrage zu halten für das "Col" jedes Mal.

Nachdem die Dokumentation zu lesen, stieß ich auf dieser @classmethod:

class MyModel(ndb.Model): 
    @classmethod 
    def _get_kind(cls): 
     return 'AnotherKind' 

Heißt das ich dies tun kann?

class Dynamic(ndb.Expando): 
    """ 
    Handles all "Post types", such as Pages, Posts, Users, Products, etc... 
    """ 
    col = ndb.StringProperty() 
    parent = ndb.IntegerProperty() 
    name = ndb.StringProperty() 
    slug = ndb.StringProperty() 

    @classmethod 
    def _get_kind(cls): 
     return 'AnotherKind' 

Aber wie kann ich "AnotherKind" dynamisch ersetzen? Kann ich etwas wie return col machen?

Danke!

+0

Ich denke (Lesen zwischen den Zeilen) sollten Sie sich PolyModel genau anschauen. –

Antwort

1

Ich weiß nicht, ob Sie das können, aber es klingt gefährlich, und GAE-Updates können Ihren Code brechen.

Die Verwendung von Unterklassen scheint eine viel sicherere Alternative zu sein. Etwas wie folgt aus:

class Dynamic(ndb.Expando): 
    parent = ndb.IntegerProperty() 
    name = ndb.StringProperty() 
    slug = ndb.StringProperty() 

class Pages(Dynamic): 
    pass 

class Posts(Dynamic): 
    pass 

class Users(Dynamic): 
    pass 

Sie könnten auch versuchen PolyModel verwenden.

Wir müssen mehr über Ihre Anwendung wissen und was Sie erreichen möchten, um spezifischere Ratschläge zu geben.