2013-09-22 4 views
2

У меня есть две таблицы, users и contacts. Я запрашиваю таблицу contacts и получаю список контактов пользователя. Затем я хотел бы написать Contact.first_name (где first_name - это строка из таблицы users) и распечатать имя этого контакта.Проблема с отображением нескольких внешних ключей в родительскую таблицу

В настоящее время объект Contact не распознаёт атрибуты таблицы user.

Вот код:

class User(Base): 

    """ Basic User definition """ 

    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    first_name = Column(Unicode(255)) 
    last_name = Column(Unicode(255)) 

    contacts = relationship('Contact', backref='users') 

class Contact(Base): 

    __tablename__ = 'contacts' 

    id = Column(Integer, primary_key=True) 
    user_id = Column(Integer) 
    contact_id = Column(Integer) 

    __table_args__ = (ForeignKeyConstraint([id], [User.id]), {}) 

Вот мой запрос:

Contact.query.filter(Contact.user_id == self.user_id).filter(Contact.state == True).all() 

Честно говоря, я не уверен, как правильно отобразить мои две внешние ключи Contact.user_id и Contact.contact_id к User.id ряд. Может быть, это источник моей проблемы?

Я очень новичок в использовании SQLAlchemy, так что это опыт обучения здесь. Спасибо за вашу помощь.

ответ

0

У вас здесь класс User, который по сути относится к самому себе. Другими словами, это self-referential many-to-many relationship. Ваши определения модели должны выглядеть следующим образом:

# This is so called association table, which links two tables in many-to-many 
# relationship. In this case it links same table's ('users') different rows. 
user_contacts = Table(
    'user_contacts', Base.metadata, 
    Column('user_id', Integer, ForeignKey('users.id'), primary_key=True), 
    Column('contact_id', Integer, ForeignKey('users.id'), primary_key=True), 
) 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    first_name = Column(String) 
    last_name = Column(String) 
    contacts = relationship(
     'User', 
     secondary=user_contacts, 
     primaryjoin=id==user_contacts.c.user_id, 
     secondaryjoin=id==user_contacts.c.contact_id 
    ) 

Затем вы можете сделать что-то вроде следующего:

u1 = User(first_name='Foo', last_name='Foo') 
u2 = User(first_name='Bar', last_name='Bar') 
u3 = User(first_name='Baz', last_name='Baz') 
u1.contacts = [u2, u3] 
session.add(u1) 
session.commit() 

# ... and in some other place in your code ... 

u = User.query.get(1) 
print u.contacts[0].first_name 
Смежные вопросы