On Aug 15, 2012, at 11:35 AM, Jason wrote:
> Is there a way to determine if a relationship property on a model class is a backref?
not in the strict sense, because a "backref" is just configurational sugar for two separate relationship() objects that are aware of each other. But you can determine one of those relationship() objects given the other one.
>
> For instance I have the model:
>
> class Department(Base):
> department_id = Column(Int(), primary_key=True)
>
> class Employee(Base):
> employee_id = Column(Int(), primary_key=True)
> department_id = Column(Int(), ForeignKey(Department.deptartment_id), nullable=False)
> department = relationship(Department, backref='employees')
>
> I'm looping through the attributes of each table and for each attribute that has a relationship property I want to determine whether the relationship constructor was called on the current table or not. So for Department.employees it would be False because the relationship was defined as a backref from another table. Is there a method/technique to accomplish this?
in this case it seems like you aren't as much concerned about the actual mapper configuration as you are about codepaths being invoked. So we "instrument" functions to track when they are called.
You'd make a wrapper around relationship() yourself, which would be used by userland code. This allows userland relationship() calls to be distinguished from those that SQLAlchemy calls itself internally:
from sqlalchemy.orm import relationship as _relationship
relationships_called = set()
def relationship(*arg, **kw):
rel = _relationship(*arg, **kw)
relationships_called.add(rel)
return rel
def was_relationship_called(rel):
return rel in relationships_called