2014-01-18 13 views
9

Ich brauche eine Liste der Eigenschaften eines Modells, die tatsächlich Beziehungen sind (das heißt, sie wurden von relationship() erstellt).SQLAlchemy, Flask: Beziehungen aus einem db.Model erhalten

sagen, dass ich ein Modell haben Foo in einem models:

class Thing(db.Model): 
    id = db.Column(...) 
    bar_id = db.Column(...) 
    foo_id = db.Column(...) 
    foo = db.relationship('Foo') 
    bar = db.relationship('Bar') 

Später, ich möchte eine Liste der Beziehungs Eigenschaften nehmen models.Thing und bekommen, dass ['foo', 'bar'] ist.

Derzeit bin ich Überprüfung jedes Attribut von dir(models.Thing) angezeigt, die vom Typ sqlalchemy.orm.attributes.InstrumentedAttribute für die Klasse seiner property Attribut passiert sein -, die entweder ein ColumnProperty oder RelationshipProperty sein kann. Das macht den Job, aber ich frage mich, ob es einen anderen Weg gibt.

Ich könnte wahrscheinlich nur alle Attribute mit der Endung _id finden und den Beziehungsnamen ableiten, aber dies könnte für einige Fälle brechen.

Wie wäre es mit einem __relationships__ = ['foo', 'bar']?

Oder ist in SQLAlchemy etwas eingebaut, um mir zu helfen?

Antwort

16

Es gibt tatsächlich - werfen Sie einen Blick auf sqlalchemy.inspection.inspect. Der Aufruf inspect auf einem zugeordneten Klasse (zum Beispiel Ihre Thing Klasse) eine Mapper zurückgeben, die eine relationships Attribut hat:

from sqlalchemy.inspection import inspect 

thing_relations = inspect(Thing).relationships 
+0

Perfect, danke! – maligree

+1

gibt es eine einfache Möglichkeit, die "Foo" und "Bar" zu sehen? – AZhao

+1

Nicht sicher, was du meinst - es lohnt sich, eine neue Frage zu stellen und diese Frage mit Kontext zu verknüpfen. –

5

Statt inspect verwenden Sie auch

model.__mapper__.relationships

2

können Sie Sie müssen nur das Modul inspect von sqlalchemy

from sqlalchemy import inspect 

i = inspect(model) 
i.relationships 
verwenden

Wenn Sie die Klasse jedes genannten Modell benötigen, können Sie tun:

referred_classes = [r.mapper.class_ for r in i.relationships] 
Verwandte Themen