I need to get a list of a model's properties which are actually relationships (that is, they were created by relationship()
).
Say I have a model Foo
in a models
:
class Thing(db.Model):
id = db.Column(...)
bar_id = db.Column(...)
foo_id = db.Column(...)
foo = db.relationship('Foo')
bar = db.relationship('Bar')
Later on, I want to take models.Thing
and get a list of relationship-properties, that is ['foo', 'bar']
.
Currently I'm checking every attribute indicated by dir(models.Thing)
that happens to be of type sqlalchemy.orm.attributes.InstrumentedAttribute
for the class of its property
attribute — which can be either a ColumnProperty
or RelationshipProperty
. This does the job but I was wondering if there's another way.
I could probably just find all attributes ending in _id
and derive the relationship name, but this could break for some cases.
How about setting a __relationships__ = ['foo', 'bar']
?
Or is there something built into SQLAlchemy to help me out?
The relationship function is a part of Relationship API of SQLAlchemy ORM package. It provides a relationship between two mapped classes. This corresponds to a parent-child or associative table relationship.
In Flask-SQLAlchemy, the backref parameter in relationship method allows you to declare a new property under a specified class as seen in the example in their docs: class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) addresses = db.relationship('Address', backref='person ...
SQLAlchemy (source code) is a Python library for accessing persistent data stored in relational databases either through raw SQL or an object-relational mapper.
The __repr__ function is defined by the designer of a type, in order to provide a means for users of the type to represent values of that type unambiguously, with a string.
There is indeed - take a look at sqlalchemy.inspection.inspect
. Calling inspect
on a mapped class (for example, your Thing
class) will return a Mapper
, which has a relationships
attribute that is dict
like:
from sqlalchemy.inspection import inspect
thing_relations = inspect(Thing).relationships.items()
Instead of using inspect
you can also use
model.__mapper__.relationships
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With