2013-01-03 107 views
0

我有用戶和實體(多到多),並使用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與用戶數據,以及entitiesuser.entities)與用戶的所有實體。

而是獲得所有實體,現在我需要從用戶那裏得到的實體,其中ID是= X 東西會像這樣工作:

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

我無法找到一個簡單的(「最好」)的方式來做到這一點,我錯過了什麼?

回答

2

您正在尋找Dynamic Relationship Loaders,他們正是你想做的事,並讓你寫:

user.entities.filter_by(id=X) 

順便說一句,你可以寫user = dbsession.query(User).get(session["userID"])。它執行相同的查詢,但前提是對象尚未存在於會話緩存中(此外,它更短)。

+0

它的工作原理,感謝關於使用「get」的提示,唯一的問題是我使用了user.entities.get(X),但即使不是用戶擁有,也給了我實體,但是「user」。 entities.filter_by(id = X)「工作得很好,謝謝! – Joaolvcm