Passé en revue les réponses déjà publiées. Je pensais que ce serait mieux si j'ajoute une réponse avec un exemple réel.
Disons que vous avez 3 modèles Django qui sont liés.
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
Ici, vous pouvez interroger le M2modèle et ses M1objets relatifs en utilisant le select_relationchamp et les M3objets en utilisantprefetch_relation champ.
Cependant , comme nous l' avons mentionné M1la relation de » de M2est ForeignKey, elle retourne juste seulement 1 record pour tout M2objet. La même chose s'applique pourOneToOneField également.
Mais M3la relation de M2est un ManyToManyFieldqui pourrait renvoyer un certain nombre deM1 objets.
Prenons un cas où vous avez 2 M2objets m21, m22qui ont les mêmes 5M3 objets associés avec des ID 1,2,3,4,5. Lorsque vous récupérez des M3objets associés pour chacun de ces M2objets, si vous utilisez select related, voici comment cela va fonctionner.
Pas:
- Trouver
m21 objet.
- Recherchez tous les
M3objets liés à l' m21objet dont les ID sont1,2,3,4,5 .
- Répétez la même chose pour l'
m22objet et tous les autres M2objets.
Comme nous avons les mêmes 1,2,3,4,5identifiants pour les deux m21,m22 objets, si nous utilisons l'option select_related, il va interroger la base de données deux fois pour les mêmes ID qui ont déjà été récupérés.
Au lieu de cela, si vous utilisez prefetch_related, lorsque vous essayez d'obtenir des M2objets, il prendra note de tous les ID que vos objets ont renvoyés (Remarque: seuls les ID) lors de l'interrogation de la M2table et, comme dernière étape, Django va effectuer une requête vers la M3table avec l'ensemble de tous les ID que vos M2objets ont renvoyés. et rejoignez-les pourM2 objets utilisant Python au lieu de la base de données.
De cette façon, vous interrogez tous les M3objets une seule fois, ce qui améliore les performances.