2010-04-13 6 views
1

Quelqu'un est-il familier avec ActiveRecord de la "has_many: à travers des" relations pour les modèles? Je ne suis pas vraiment un gars Rails, mais c'est essentiellement ce que je suis en train de faire.relation sqlalchemy par un autre (déclarative)

À titre d'exemple, les projets artificiel considèrent programmeurs et missions:

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

from sqlalchemy import Column, ForeignKey 
from sqlalchemy.types import Integer, String, Text 
from sqlalchemy.orm import relation 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

class Assignment(Base): 
    __tablename__ = 'assignment' 
    id = Column(Integer, primary_key=True) 
    description = Column(Text) 

    programmer_id = Column(Integer, ForeignKey('programmer.id')) 
    project_id = Column(Integer, ForeignKey('project.id')) 

    def __init__(self, description=description): 
     self.description = description 

    def __repr__(self): 
     return '<Assignment("%s")>' % self.description 

class Programmer(Base): 
    __tablename__ = 'programmer' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(64)) 

    assignments = relation("Assignment", backref='programmer') 

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

    def __repr__(self): 
     return '<Programmer("%s")>' % self.name 

class Project(Base): 
    __tablename__ = 'project' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(64)) 
    description = Column(Text) 

    assignments = relation("Assignment", backref='project') 

    def __init__(self, name=name, description=description): 
     self.name = name 
     self.description = description 

    def __repr__(self): 
     return '<Project("%s", "%s...")>' % (self.name, self.description[:10]) 

engine = create_engine('sqlite://') 
Base.metadata.create_all(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 

projets ont plusieurs missions.

Les programmeurs ont beaucoup de missions. (Euphémisme?)

Mais dans mon bureau au moins, les programmeurs ont également de nombreux projets - Je voudrais cette relation à déduire à travers les missions assignées au programmeur.

Je voudrais le modèle de programmeur pour avoir un attribut « projets » qui renvoie une liste des projets associés au programmateur à travers le modèle d'affectation. Comment puis-je décrire clairement cette relation et simplement en utilisant la syntaxe déclarative de sqlalchemy?

Merci!

Répondre

2

Il y a deux façons que je vois:

  1. définir une relation Programmer.projects avec secondary='assignment'.

  2. Je définis Assignment.project comme relation et Programmer.projects comme association_proxy('assignments', 'project') (probablement vous souhaitez également définir un créateur). Voir Simplifying Association Object Relationships chapitre pour plus d'informations.

+0

$ diff projects.bak projects.py 30a31 > Projets = relation ("Projet", 'cession' = secondaire) ^ à la fois simple et claire, je vous remercie – clayg

Questions connexes