Prenons l'exemple d'un joueur de football (Joueur) et de sa position (Position).
Dans ce cas, ManyToMany entre en jeu.
Exemple de modèle
class Position(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20, unique=True)
class Player(models.Model):
... (Omis) ...
position = models.ManyToManyField(Position)
Après la migration de Django à l'aide de la définition de modèle ci-dessus, les trois tables suivantes seront créées.
La table nommée player_position est le PK de la table de joueur et le PK de la table de position, et les informations sont gérées comme suit.
Extraire toutes les positions du joueur "Pirlo"
positions = Player.objects.get(name='Pirlo').position.all()
[print(p.name) for p in positions]
Résultat de l'exécution:
DM
CM
Extraire tous les joueurs en position "CB" (Méthode 1)
players = Player.objects.filter(position=Position.objects.get(name='CB'))
[print(p.name) for p in players]
Résultat de l'exécution:
Maldini
Nesta
Extraire tous les joueurs en position "CB" (Méthode 2)
Exemple de modèle (méthode 2)
class Player(models.Model):
... (Omis) ...
position = models.ManyToManyField(Position, related_name='player')
players = Position.objects.get(name='CB').player.all()
[print(p.name) for p in players]
Résultat de l'exécution:
Maldini
Nesta
La méthode 1 et la méthode 2 sont les méthodes 1 et 2 qui extraient tous les joueurs dans la position «CB», mais lorsque j'ai vérifié la requête créée, les deux ont généré le SQL suivant.
SELECT "soccer_player"."id", "soccer_player"."name", "soccer_player"."team_id"
FROM "soccer_player"
INNER JOIN "soccer_player_position" ON ("soccer_player"."id" = "soccer_player_position"."player_id")
WHERE "soccer_player_position"."position_id" = 1
Recommended Posts