Explorer les relations de modèle dans Flask

Barbara Streisand
Libérer: 2024-09-21 14:17:08
original
340 Les gens l'ont consulté

Exploring Model Relationships in Flask

Codifier les relations entre les classes peut être difficile au début ! Cela ressemble à un tas de mots mélangés – cette chose connaît cette chose à travers cette chose, mais pas cette autre chose. L’utilisation d’exemples réels peut être utile pour visualiser ces relations.

Par exemple, disons que vous avez des astronautes. Au cours de nombreuses années, ces astronautes visiteront de nombreuses plantes ; une planète par mission. Ainsi, chaque mission compte un astronaute et une planète, et de nombreuses planètes sont visitées par de nombreux astronautes.

Dans Flask, la relation entre l'astronaute et la planète est une relation plusieurs-à-plusieurs, tandis que la relation entre l'astronaute et la mission et la planète et la mission est toutes deux une relation un-à-plusieurs. Nous avons trois modèles : Le modèle mission fonctionne comme une table de jointure entre le modèle astronaute et le modèle planète. Les classes sont appelées modèles car elles définissent (ou modélisent) les relations entre vos données.

Alors, comment coder ces relations ?

Je trouve qu'il est plus facile de commencer par la table de jointure, car je construis les deux relations à partir de là.

class Mission(db.Model):
    __tablename__ = 'missions'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
Copier après la connexion

C'est par cela que nous commençons pour notre classe Mission.

Nous savons que chaque mission compte un astronaute :

astronaut = db.relationship 
Copier après la connexion

db.relationship définit la façon dont deux modèles sont liés les uns aux autres.

Connectons-le à la classe Astronaute....

astronaut = db.relationship('Astronaut')
Copier après la connexion

et ajoutons maintenant la relation bidirectionnelle entre les deux modèles (Astronaut et Mission) :

astronaut = db.relationship('Astronaut', back_populates="missions")
Copier après la connexion

Excellent travail ! Puisque Mission détient à la fois les relations Astronaute et Planète, faisons de même avec la planète :

planet = db.relationship('Planet', back_populates="missions")
Copier après la connexion

Voici notre classe Mission avec les relations :

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")

Copier après la connexion

Génial ! Revenons en arrière et jetons un œil à nos instructions : Le modèle mission fonctionne comme une _join table entre le modèle astronaute et la planète modèle._
Nous devons donc relier l’astronaute à la mission et la planète à la mission. Commençons par Astronaute :

missions = db.relationship('Mission', back_populates="astronauts")
Copier après la connexion

Les missions sont ici plurielles, car un astronaute en effectue plusieurs (espérons-le !).

Et puis Planet, qui devrait ressembler à ça :

missions = db.relationship('Mission', back_populates="planets")
Copier après la connexion

GÉNIAL ! Tous ensemble, cela ressemble à :

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")

Copier après la connexion

Enfin, ajoutons nos clés étrangères à notre table de missions. Une clé étrangère est un entier qui fait référence à un élément dans une autre base de données qui relie les deux. Par exemple, la clé étrangère de l'astronaute 1 est 1 dans le tableau des missions, donc chaque fois que nous voyons le chiffre 1 dans cette colonne, nous savons qu'il s'applique à cet astronaute !

Mission est la seule classe qui a besoin de clés étrangères, puisqu'elle est en charge de toutes les relations.

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')
Copier après la connexion

Travail fantastique ! Nous avons établi des relations entre nos modèles. Merci d'avoir codé !

Sources : Merci à Flatiron School pour ce laboratoire ! J'ai changé le nom de la classe « Scientifique » en « Astronaute ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!