2010-07-04 14 views
10

ho le seguenti tabelle definite in modo dichiarativo (versione molto semplificata):SQLAlchemy molti-a-molti sui tavoli dichiarativi

class Profile(Base): 
     __tablename__ = 'profile' 

     id = Column(Integer, primary_key = True) 
     name = Column(String(65), nullable = False) 

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


class Question(Base): 
    __tablename__ = 'question' 

    id = Column(Integer, primary_key = True) 
    description = Column(String(255), nullable = False) 
    number = Column(Integer, nullable = False, unique = True) 


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



class Answer(Base): 
    __tablename__ = 'answer' 

    profile_id = Column(Integer, ForeignKey('profile.id'), primary_key = True) 
    question_id = Column(Integer, ForeignKey('question.id'), primary_key = True) 
    value = Column(Integer, nullable = False) 


    def __init__(self, profile_id, question_id, value): 
     self.profile_id = profile_id 
     self.question_id = question_id 
     self.value = value 

profilo è collegato alla prima questione, tramite una relazione molti-a-molti. Nella tabella di collegamento (Risposta) ho bisogno di memorizzare un valore per la risposta.

La documentazione dice che ho bisogno di usare un oggetto di associazione per farlo, ma mi confonde e non riesco a farlo funzionare.

Come si definisce la relazione molti-a-molti per le tabelle Profilo e Domanda utilizzando Rispondi come tabella intermedia?

risposta

13

La documentazione dice che ho bisogno di utilizzare un oggetto un'associazione per fare questo, ma mi sta confondendo e io non riesco a farlo funzionare.

Proprio così. E la classe Answer è l'oggetto di associazione in quanto esegue il mapping alla "risposta" della tabella di associazione.

Come faccio a definire il molti-a-molti relazione per il profilo e tavoli domanda utilizzando risposta come la tabella intermedia ?

Il codice che hai presentato nella tua domanda è corretto. Ha bisogno soltanto di ulteriori informazioni sulle relazioni a livello ORM:

from sqlalchemy.orm import relationship 

... 

class Profile(Base): 
    __tablename__ = 'profile' 

    ... 

    answers = relationship("Answer", backref="profile") 

    ... 


class Question(Base): 
    __tablename__ = 'question' 

    ... 

    answers = relationship("Answer", backref="question") 

    ... 

Inoltre, non si dovrebbe valori di configurazione per profile_id e question_id in funzione init del tuo risposta, perché è l'ORM che è responsabile della loro impostazione basata conseguenza su di te assegnazioni agli attributi di relazione dei tuoi oggetti.

Si può essere interessati a leggere documentation for declarative, in particolare la parte che riguarda configuring relationships. Anche la lettura di working with related objects può essere utile.

+0

Modificato per correggere collegamenti interrotti alla documentazione. – rbp

+0

Questo non sembra giusto. Sembra che la tua risposta colleghi solo ciascun lato alla tabella associativa attraverso una relazione molti-a-uno. Non si fa menzione di molti a molti, vale a dire il seguente uso implica molti a molti a livello di orm: Profile.questions –