Betrachten Sie als Beispiel einen Fußballspieler (Player) und seine Position (Position).
In diesem Fall kommt ManyToMany ins Spiel.
Modellbeispiel
class Position(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20, unique=True)
class Player(models.Model):
... (weggelassen) ...
position = models.ManyToManyField(Position)
Nach der Migration von Django mithilfe der obigen Modelldefinition werden die folgenden drei Tabellen erstellt.
Die Tabelle mit dem Namen player_position ist die PK der Spielertabelle und die PK der Positionstabelle. Die Informationen werden wie folgt verwaltet.
Extrahiere alle Positionen des Spielers "Pirlo"
positions = Player.objects.get(name='Pirlo').position.all()
[print(p.name) for p in positions]
Ausführungsergebnis:
DM
CM
Extrahiere alle Spieler in der Position "CB" (Methode 1)
players = Player.objects.filter(position=Position.objects.get(name='CB'))
[print(p.name) for p in players]
Ausführungsergebnis:
Maldini
Nesta
Extrahiere alle Spieler in der Position "CB" (Methode 2)
Modellbeispiel (Methode 2)
class Player(models.Model):
... (weggelassen) ...
position = models.ManyToManyField(Position, related_name='player')
players = Position.objects.get(name='CB').player.all()
[print(p.name) for p in players]
Ausführungsergebnis:
Maldini
Nesta
Methode 1 und Methode 2 sind Methoden 1 und 2, die alle Spieler an der Position "CB" extrahieren. Als ich jedoch die erstellte Abfrage überprüfte, generierten beide die folgende SQL.
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