0

Ich habe die folgenden Modelle:Querying verschachtelt KeyProperties

class Company(ndb.Model): 
    name = ndb.StringProperty(indexed=False) 
    # some other fields 

class User(polymodel.PolyModel): 
    company = ndb.KeyProperty(kind=Company) 
    # some other fields 

class Object(ndb.Model): 
    user = ndb.KeyProperty(kind=User) 
    # some other fields 

Jetzt habe ich ein user und ich möchte Objects abzufragen, die mit anderen Users in der gleichen Firma wie folgt verbunden sind:

Object.query(Object.user.company == user.company) 

Natürlich funktioniert das nicht, da Object.user ein Schlüssel ist und ich nicht auf irgendetwas darüber hinaus zugreifen kann.

Gibt es eine Möglichkeit, es zu tun? Ich brauche nur den Firmenschlüssel, ich dachte an eine ComputedProperty, aber ich bin mir nicht sicher, ob es die beste Lösung ist. Außerdem wäre es besser, basierend auf einem Feld in company abzufragen.

Antwort

1

Sie müssen redundante Informationen denormalisieren und speichern, da der Datenspeicher keine Joins unterstützt.

Zum Beispiel kann ein Benutzer nur ein Mitglied einer Firma sein, wenn Sie wirklich alle Objekte suchen müssen, deren Benutzer ein Mitglied einer bestimmten Firma ist, und dann den Firmenschlüssel im Objekt speichern.

Verwenden Sie eine berechnete Eigenschaft, wenn dies am besten für Sie funktioniert.

Verwenden Sie alternativ eine Factory, die den Benutzer immer als Argument verwendet und auf diese Weise ein Objekt erstellt.