我在模型中设置了以下关系:
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
.
有没有办法确定该属性是由 abackref
添加的relationship
?
更新
也许我应该补充一点,如果我删除它,它在这种情况下可以正常工作,backref
因为我不需要它,但我想保留它。
更新
作为临时修复,我在基类中添加了一个类属性:
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
如果有更好的方法,请告诉我,因为这看起来不是最佳的。