当我将一行持久化到各种实体类型的通用表时,我需要将实体类型id设置为列值。我应该能够在实例化时为每个特定实例加载实体类型id,因为它可以通过简单的select语句访问。我希望在类(或实例)级别自动检索/设置该id,而无需执行查询和/或手动设置,每次保留一行“实体类型”
我在mixin上尝试了一个entity_type_id@属性,该属性使用object_会话返回entity_类型的id,但由于我不完全理解的原因,在提交/刷新会话时orm仍然将null插入为entity_type_id值(我的猜测是,拥有“属性”本身与在实例上设置属性值和/或引起问题不同,因为基类中的列名具有相同的名称)
以下是我的模式中相关模型的精简版本:
class EntityType(Base):
__tablename__ = 'entity_type'
id = Column(UUID(as_uuid=True), primary_key=True, server_default=FetchedValue())
table_name = Column(String, nullable=False)
ui_label = Column(Text, unique=True, nullable=False)
entry_key = Column(Text, unique=True, nullable=False)
基类模型:
class TrackedEntity(Base):
@declared_attr
def __tablename__(cls):
return convert(cls.__name__)
__table_args__ = (
UniqueConstraint('entity_type_id', 'label'),
)
id = Column(UUID(as_uuid=True), primary_key=True, server_default=FetchedValue())
entity_type_id = Column('entity_type_id', ForeignKey('entity_type.id'))
label = Column('label', String, nullable=False)
entity_type = relationship('EntityType')
polymorphic_discriminator = column_property(select([EntityType.table_name]).where(EntityType.id == entity_type_id).as_scalar())
@declared_attr
def entity_type_label(cls):
return association_proxy('entity_type', 'label')
@declared_attr
def __mapper_args__(cls):
if cls.__name__ == 'TrackedEntity':
return {
"polymorphic_on": cls.polymorphic_discriminator,
"polymorphic_identity": cls.__tablename__
}
else:
return {"polymorphic_identity": cls.__tablename__}
儿童班混音:
class TrackedEntityMixin(object):
# noinspection PyMethodParameters
@declared_attr
def id(cls) -> Column:
return Column(ForeignKey('tracked_entity.id'), primary_key=True)
#gets me the id but isn't very helpful like this, still needs to be manually set like child.entity_type_id = child._entity_type_id
@property
def _entity_type_id(self):
return object_session(self). \
scalar(
select([EntityType.id]).
where(EntityType.table_name == self.__tablename__)
)
子类模型:
class DesignedMolecule(TrackedEntityMixin, TrackedEntity):
extra = Column('extra', String)
parents = relationship('TrackedEntity', secondary='mix_dm_parent_entity')
目前没有回答
相关问题 更多 >
编程相关推荐