我希望创建一个从另一个表填充的对象的映射属性。
使用 SQLAlchemy 文档示例,我希望在 Address 类中创建一个 user_name 字段,以便可以轻松查询和访问它(无需第二次往返数据库)
例如,我希望能够通过user_name
Address.query.filter(Address.user_name == 'wcdolphin').first()
进行查询和过滤
并且还可以访问所有地址对象的 user_name
属性,而不会降低性能,并像 __tablename__
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
addresses = relation("Address", backref="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String(50))
user_name = Column(Integer, ForeignKey('users.name'))#This line is wrong
我该怎么做?
我发现文档相对难以理解,因为它似乎不符合大多数示例,尤其是 Flask-SQLAlchemy 示例。
最佳答案
您可以在查询对象上使用 join
来完成此操作,无需直接指定此属性。所以你的模型看起来像:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relation
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite:///')
Session = sessionmaker(bind=engine)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
addresses = relation("Address", backref="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String(50))
user_id = Column(Integer, ForeignKey("users.id"))
Base.metadata.create_all(engine)
地址后过滤用户名的查询如下所示:
>>> session = Session()
>>> session.add(Address(user=User(name='test')))
>>> session.query(Address).join(User).filter(User.name == 'test').first()
<__main__.Address object at 0x02DB3730>
编辑:由于您可以直接从地址对象访问用户,因此无需直接将属性引用到地址类:
>>> a = session.query(Address).join(User).filter(User.name == 'test').first()
>>> a.user.name
'test'
关于python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10891552/