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

Python 在通过关系添加SQLAlchemy模型时,如何找到要使用的正确类?,python,orm,sqlalchemy,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) user

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

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')]
基本上有一个
用户
s表,每个
用户
可以有任意数量的
编号
s与其关联

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

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


我认为能够做到这一点的最有效的理由是在mixin的情况下——如果有一些基类需要向用户添加新数字的能力,而不需要具体了解要使用什么类。

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

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