У меня есть следующие отношения установить в модели:Определить, если свойство является backref в SQLAlchemy
role_profiles = Table('roleprofile', Base.metadata,
Column('role_id', Integer, ForeignKey('role.id')),
Column('profile_id', Integer, ForeignKey('profile.id'))
)
class profile(Base):
__tablename__ = 'profile'
# Columns...
roles = relationship('role', secondary=role_profiles, backref='profiles')
class role(Base):
__tablename__ = 'role'
# Columns...
Так как я теперь понимаю, что это работает, что свойство роли на объекте профиля будет содержать список ролевых классов (что он делает).
Что я хочу сделать, это сериализовать для каждого свойства класса модели в целом. Он отлично работает для верхнего профиля класса и определить, что есть список roles
, что я должен рекурсия в:
# I need a statement here to check if the field.value is a backref
#if field.value is backref:
# continue
if isinstance(field.value, list):
# Get the json for the list
value = serialize.serialize_to_json(field.value)
else:
# Get the json for the value
value = cls._serialize(field.value)
Проблема заключается в том, что backref
отношениях добавляет указатель на профиль. Затем один и тот же профиль сериализуется и повторяет роли снова и снова до stack overflow
.
Есть ли способ определить, что свойство является backref
, добавленным relationship
?
Update
Может быть, я должен добавить, что он отлично работает в этом случае, если я удалить backref
, так как я не нужно, но я хотел бы сохранить его.
Update
Как временное решение я добавил свойство класса к моему базовому классу:
class BaseModelMixin(object):
"""Base mixin for models using stamped data"""
__backref__ = None
и добавить его так:
class role(Base):
__tablename__ = 'role'
__backref__ = ('profiles',)
# Columns...
и использовать его, как это в моем рекурсии:
if self.__backref__ and property_name in self.__backref__:
continue
Если есть лучший способ, пожалуйста, дайте мне знать, потому что это не выглядит оптимальным.
сделаю. Я вернусь ... Спасибо – Asken
Будьте осторожны, чтобы вы не столкнулись с встроенным 'Python'' 'проверкой –