2010-07-04 9 views
10

He las siguientes tablas definidas de forma declarativa (versión muy simplificada):sqlalchemy muchos-a-muchos relación de tablas declarativas

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 

perfil está vinculado a la pregunta a través de una relación de muchos a muchos. En la tabla de vinculación (Respuesta) necesito almacenar un valor para la respuesta.

La documentación dice que necesito usar un objeto de asociación para hacer esto pero me confunde y no puedo hacer que funcione.

¿Cómo se define la relación muchos a muchos para las tablas Perfil y Pregunta utilizando Answer como la tabla intermediaria?

Respuesta

13

La documentación dice que necesito utilizar un objeto de asociación para hacer esto pero que me está confundiendo y no puedo conseguirlo para trabajar.

Así es. Y la clase Answer es su objeto de asociación, ya que se asigna a la tabla de asociación 'answer'.

¿Cómo definir el relación de muchos a muchos para el perfil y tablas pregunta usando como respuesta la tabla intermediario ?

El código que ha presentado en su pregunta es correcto. Sólo se necesita información adicional acerca de las relaciones en el nivel 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") 

    ... 

Además, No debe dar los valores de configuración para profile_id y question_id en función init de su respuesta, porque es el ORM que es responsable de establecer ellos basados ​​en consecuencia en tus asignaciones a los atributos de relación de tus objetos.

Usted puede estar interesado en leer documentation for declarative, sobre todo la parte configuring relationships. Leer sobre working with related objects puede ser útil también.

+0

Editado para corregir enlaces rotos a la documentación. – rbp

+0

Esto no se ve bien. Su respuesta parece que solo vincula cada lado de la tabla asociativa a través de una relación de muchos a uno. No se menciona a muchos, por ejemplo, el siguiente uso implica muchos a muchos a nivel de orm: Profile.questions –

Cuestiones relacionadas