我目前正在关注以下情况 -
user_association = Table('user_association', Base.metadata,
Column('user_id', UUIDType, ForeignKey('user.id')),
Column('personality_id', UUIDType, ForeignKey('personality.id'))
)
class User(Base, DBBase):
__tablename__ = 'user'
id = Column(Integer, primary_key = True)
name = Column(String), nullable = True)
personalities = relationship(
"Personality",
secondary=user_association,
back_populates="users"
)
class Personality(Base, DBBase):
__tablename__ = 'personality'
id = Column(Integer, primary_key = True)
value = Column(String, nullable = True)
users = relationship(
"User",
secondary=user_association,
back_populates="personalities"
)
Personality
对象只有一个值(与典型对象不同,这些值被硬编码到代码库中)。我想知道是否有某种方法可以实现这种相同的关系行为,而没有一个封装了个性的显式存根表。有什么想法吗?
答案 0 :(得分:0)
我太好奇了如何定义一个非基于表的" selectable" sqlalchemy中的类并将其用作映射器,这是一个替代实现,用于将个性值放入枚举列中:
import enum
from sqlalchemy_utils import ChoiceType
class PersonalityEnum(enum.IntEnum):
I = 0
N = 1
T = 2
J = 3
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
personalities = relationship(
"UserPersonality",
back_populates="users"
)
class UserPersonality(Base):
__tablename__ = 'user_personality'
user_id = Column(Integer, ForeignKey('user.id'))
personality = Column(ChoiceType(PersonalityEnum, impl=Integer()))
__table_args__ = (
PrimaryKeyConstraint('user_id', 'personality'),
)
users = relationship("User")
def __init__(self, p):
super().__init__(personality=p)
def __repr__(self):
return f'<UserPersonality user {self.user_id}, personality {self.personality.name}>'
你可以像以下一样使用它:
u = User(id=0, name='Guido van Rossum')
u.personalities.append(UserPersonality(PersonalityEnum.I))
u.personalities.append(UserPersonality(PersonalityEnum.J))