2012-06-16 5 views
3

Supposons que j'ai 3 tables dans sqlalchemy. Utilisateurs, rôles et UserRoles définis de manière déclarative. Comment peut-on penser à faire quelque chose comme ceci:sqlalchemy relations et requête sur les relations

user = Users.query.get(1) # get user with id = 1 
user_roles = user.roles.query.limit(10).all() 

Actuellement, si je veux les rôles utilisateur, je dois interroger l'un des 3 tables et effectuer les jointures afin d'obtenir les résultats escomptés. Appeler directement user.roles apporte une liste d'éléments que je ne peux pas filtrer ou limiter, donc ce n'est pas très utile. Rejoindre des choses n'est pas très utile non plus puisque j'essaye de faire une interface de repos avec des demandes telles que: localhost/users/1/roles donc juste par cette requête je dois être capable de faire Users.query.get(1).roles.limit(10) etc etc qui devrait vraiment "améliorer" mon interface de repos sans trop code pléthorique et si conditionnel et sans avoir à savoir quelle table rejoindre sur quoi. Le modèle des utilisateurs a déjà les rôles en tant que propriété de relation, alors pourquoi ne puis-je pas simplement interroger une propriété de relation comme je le fais avec les modèles normaux?

Répondre

10

Utilisez simplement Dynamic Relationship Loaders. Code ci-dessous verbatim de la documentation liée à ci-dessus:

class User(Base): 
    __tablename__ = 'user' 

    posts = relationship(Post, lazy="dynamic") 

jack = session.query(User).get(id) 

# filter Jack's blog posts 
posts = jack.posts.filter(Post.headline=='this is a post') 

# apply array slices 
posts = jack.posts[5:20]