2

私は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()

正直なところ、2 つの外部キーContact.user_idを行Contact.contact_idに適切にマップする方法がわかりませんUser.id。多分これが私の問題の原因ですか?

SQLAlchemy を使用するのは初めてなので、これは学習体験です。ご協力いただきありがとうございます。

4

1 に答える 1

0

ここにあるのはUser、本質的にそれ自体を参照するクラスです。つまり、自己参照型の多対多の関係です。モデル定義は次のようになります。

# 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
于 2013-09-23T17:31:03.287 に答える