如何通过关系添加SQLAlchemy模型时找到正确的类?

时间:2017-06-13 20:41:48

标签: python orm sqlalchemy

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

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 s表,每个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') ...]

......但这似乎相当迟钝,我依靠它完全不舒服。

我认为想要能够做到这一点的最有效的理由是在mixins的情况下 - 如果有一些基类需要能够将新数字附加到用户而没有具体知道哪个类到使用

1 个答案:

答案 0 :(得分:1)

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