【问题标题】:query related entities on sqlalchemy (many-to-many)在 sqlalchemy 上查询相关实体(多对多)
【发布时间】:2012-12-18 01:26:28
【问题描述】:

我有用户和实体(多对多),并使用 sqlalchemy,这个模型:

from sqlalchemy import Table, Column, Unicode, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import scoped_session, sessionmaker

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()
users_entities = Table('users_entities', Base.metadata,
    Column('userID', Integer, ForeignKey('users.id')),
    Column('entitieID', Integer, ForeignKey('entities.id'))
)


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(Unicode(20))
    password = Column(Unicode(101))
    entities = relationship("Entities", secondary=users_entities)

    def __init__(self, username, password):
        self.username = username
        self.password = password


class Entities(Base):
    __tablename__ = 'entities'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(20))
    descr = Column(Unicode(101))
    url = Column(Unicode(101))

    def __init__(self, name, descr, url):
        self.name = name
        self.descr = descr
        self.url = url

所以,当我使用时:

user = dbsession.query(User).filter_by(id=session["userID"]).first()
entities = user.entities

我得到带有用户数据的user,以及带有所有用户实体的entities(user.entities)。

但现在我需要从 id 为 = X 的用户那里获取一个实体,而不是获取所有实体 像这样工作的东西:

user.query(Entities).filter_by(id=X)

我找不到一个简单(“最佳”)的方法来做到这一点,我错过了什么吗?

【问题讨论】:

    标签: python mysql sqlalchemy relationship pyramid


    【解决方案1】:

    您正在寻找Dynamic Relationship Loaders,它们正是您想要做的,并且使您能够写作:

    user.entities.filter_by(id=X)
    

    顺便说一句,你可以写user = dbsession.query(User).get(session["userID"])。它执行相同的查询,但前提是对象尚未在会话缓存中(另外,它更短)。

    【讨论】:

    • 它有效,感谢有关使用“get”的提示,唯一的问题是我使用了 user.entities.get(X) 但这给了我实体,即使它不属于用户,但是“user.entities.filter_by(id=X)” 工作得很好,谢谢!
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 2012-11-20
    • 2019-01-18
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多