クラス間の関係をコーディングするのは、最初は難しいかもしれません。たくさんの言葉を組み合わせたように聞こえます。この物は、あの物を通してこの事を知っていますが、他の物は知りません。実際の例を使用すると、これらの関係を視覚化するのに役立ちます。
たとえば、宇宙飛行士が何人かいるとします。長年にわたって、これらの宇宙飛行士は多くの植物を訪問します。ミッションごとに 1 つの惑星。したがって、各ミッションには1人の宇宙飛行士と1つの惑星がおり、多くの惑星には多くの宇宙飛行士が訪れます。
Flask では、Astronaut と Planet の関係は多対多の関係ですが、Astronaut と Mission、および Planet と Mission の関係はどちらも 1 対多です。 3 つのモデルがあります。 ミッション モデルは、宇宙飛行士 モデルと 惑星 モデル間の 結合テーブル として動作します。クラスはデータ間の関係を定義 (またはモデル化) するため、モデルと呼ばれます。
では、これらの関係をどのようにコーディングすればよいでしょうか?
そこから両方の関係を構築するので、結合テーブルから始めるのが最も簡単だと思います。
class Mission(db.Model): __tablename__ = 'missions' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String)
これがミッション クラスの始まりです。
私たちは、各ミッションに1人の宇宙飛行士がいることを知っています:
astronaut = db.relationship
db.relationship は、2 つのモデルが互いにどのように関連するかを定義します。
これを Astronaut クラスに接続しましょう....
astronaut = db.relationship('Astronaut')
そして次に、2 つのモデル (Astronaut と Mission) 間の双方向の関係を追加しましょう:
astronaut = db.relationship('Astronaut', back_populates="missions")
素晴らしい仕事です! Mission は Astronaut と Planet の両方の関係を保持しているため、planet についても同じことを行いましょう:
planet = db.relationship('Planet', back_populates="missions")
これは関係を含むミッション クラスです:
class Mission(db.Model): __tablename__ = 'missions' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) astronaut = db.relationship('Astronaut', back_populates="missions") planet = db.relationship('Planet', back_populates="missions")
すごい!戻って手順を見てみましょう: ミッション モデルは、宇宙飛行士 モデルと 惑星 の間の _join テーブル として動作します。モデル。_
したがって、宇宙飛行士とミッション、惑星とミッションをリンクする必要があります。宇宙飛行士から始めましょう:
missions = db.relationship('Mission', back_populates="astronauts")
ここではミッションが複数形になっています。なぜなら、宇宙飛行士は複数のミッションに挑戦するからです (できれば!)。
次に、Planet ですが、これは似ているはずです:
missions = db.relationship('Mission', back_populates="planets")
すごいですね!すべてをまとめると、次のようになります:
class Planet(db.Model): __tablename__ = 'planets' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) distance_from_earth = db.Column(db.Integer) nearest_star = db.Column(db.String) missions = db.relationship('Mission', back_populates="planet") class Astronaut(db.Model): __tablename__ = 'astronauts' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) field_of_study = db.Column(db.String) missions = db.relationship('Mission', back_populates="astronaut") class Mission(db.Model): __tablename__ = 'missions' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) astronaut = db.relationship('Astronaut', back_populates="astronauts") planet = db.relationship('Planet', back_populates="missions")
最後に、外部キーをミッション テーブルに追加しましょう。外部キーは、2 つをリンクする別のデータベース内の項目を参照する整数です。たとえば、ミッション テーブルでは宇宙飛行士 1 の外部キーは 1 であるため、その列に数字 1 が表示されるたびに、それがその宇宙飛行士に適用されることがわかります。
Mission はすべての関係を担当するため、外部キーを必要とする唯一のクラスです。
class Mission(db.Model, SerializerMixin): __tablename__ = 'missions' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) astronaut_id = db.Column(db.Integer, db.ForeignKey('astronauts.id')) planet_id = db.Column(db.Integer, db.ForeignKey('planets.id')) astronaut = db.relationship('Astronaut', back_populates="missions") planet = db.relationship('Planet', back_populates="missions") serialize_rules = ('-astronaut.missions', '-astronaut.planets')
素晴らしい仕事です!モデル間にいくつかの関係を設定しました。コーディングしてくれてありがとう!
出典: このラボを提供してくれた Flatiron School に感謝します。クラス名「科学者」を「宇宙飛行士」に変更しました。
以上がFlask でのモデルの関係の探索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。