Flask でのモデルの関係の探索

Barbara Streisand
リリース: 2024-09-21 14:17:08
オリジナル
460 人が閲覧しました

Exploring Model Relationships in Flask

クラス間の関係をコーディングするのは、最初は難しいかもしれません。たくさんの言葉を組み合わせたように聞こえます。この物は、あの物を通してこの事を知っていますが、他の物は知りません。実際の例を使用すると、これらの関係を視覚化するのに役立ちます。

たとえば、宇宙飛行士が何人かいるとします。長年にわたって、これらの宇宙飛行士は多くの植物を訪問します。ミッションごとに 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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート