在通过关系添加SQLAlchemy模型时,如何找到要使用的正确类?

2024-04-20 03:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

可能是一个不雅观的问题标题,但希望这个框架设置能更清楚地解释问题:

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String)


class Number(Base):
    __tablename__ = 'number'
    id = Column(Integer, primary_key=True)
    users_id = Column(Integer, ForeignKey('user.id'))
    user = relationship('User', backref=backref('numbers'))
    value = Column(String)


joe = User(name='Joe')
joe.numbers = [
    # Here we need to know that the class we want is named "Number".
    # However, in some contexts (think abstract base classes or mixins) we might
    # not necessarily know that, or have a way to import/reference it.
    Number(value='212-555-1234'),
    Number(value='201-555-1111'),
    Number(value='917-555-8989')]

基本上有一个User表,每个User可以有任意数量的Number与其关联

是否有一种干净的方法,仅通过User的属性就可以找到对Number类的引用(并能够从中创建实例),而无需直接导入Number?在this question的影响下,我想到的最好的办法是:

from sqlalchemy.orm import object_mapper
number_class = object_mapper(joe).relationships['numbers'].mapper.class_
joe.numbers = [number_class(value='212-555-1234') ...]

。。。但这似乎相当迟钝,我不太喜欢依赖它

我认为能够做到这一点的最有效的原因是在mixin的情况下——如果有一些基类需要能够向用户追加新的数字,而不需要具体知道要使用什么类


Tags: idnumberbasevaluecolumnintegerclasswe
1条回答
网友
1楼 · 发布于 2024-04-20 03:32:15

有几种方法可以做到这一点,但我认为最简单(而且足够干净)的方法是在用户类上存储您需要的内容,因为您的用户类已经实现绑定到Number类,因为它在创建关系时导入并使用Number。因此,您可以添加一个User.add_number()方法,在该方法中,您可以传递参数来添加数字,然后让它创建数字并存储在self上

相关问题 更多 >