我有这些classe,其中items(class Item)与channel对象有关:
channel_items = Table(
"channel_items",
metadata,
Column("channel_id", Integer,
ForeignKey("channels.id")),
Column("item_id", Integer,
ForeignKey(Item.id))
)
class Channel(rdb.Model):
""" Set up channels table in the database """
rdb.metadata(metadata)
rdb.tablename("channels")
id = Column("id", Integer, primary_key=True)
title = Column("title", String(100))
items = relation(Item, secondary=channel_items, backref="channels")
class Item(rdb.Model):
""" Set up items table in the database """
rdb.metadata(metadata)
rdb.tablename("items")
id = Column("id", Integer, primary_key=True)
title = Column("title", String(100))
我知道如何使用以下内容获取所有列:
session = rdb.Session() channels = session.query(Channel).order_by(Channel.title)
但是,我想从两个表中获取一些列,并将channel对象中的字段项与Item类相关联,因为我尝试过这样的事情:
session = rdb.Session()
channels = session.query(Channel.title, Item.title).order_by(Channel.title)
我获得了频道标题和项目标题,但我只是从每个频道获得一个项目。我想获得与每个频道相关的所有项目。
提前致谢!
答案 0 :(得分:1)
你想加入这里,而不是笛卡尔产品。
如果我理解正确,并且您只想选择标题,而不是建立实际实例,则可以这样做:
session = rdb.Session()
result = session.query(Channel).join(Channel.items).values(Channel.title, Item.title)
结果是生成器,它将为您提供(Channel.title, Item.title)
个元组。
因此,如果您有一些'channel1'有两个项'item1'和'item2',您将收到
[('channel1', 'item1'), ('channel1', 'item2')]
如果你只需要加载与其相关项目的频道,你可能会想要这样:
from sqlalchemy.orm import eagerload
channels = session.query(Channel).options(eagerload('items')).all()
channels[0].items[0].title