12
votes

Obtenez des objets de clé étrangère dans une seule requête - Django

J'ai 2 modèles dans mon code Django: xxx

disent que Modela dispose de 100 enregistrements, tous peuvent ne pas avoir de liens vers ModelB

maintenant dire que je Voulez-vous obtenir une liste de chaque enregistrement de modèle avec les données de ModelB

Je ferais: xxx

puis pour obtenir les données de modelb je voudrais doivent faire xxx

Cependant, cela exécute une requête sur chaque instance de i. Faisant ainsi 101 questions à courir.

Y a-t-il un moyen de courir tout cela en seulement une première requête. Ou au moins moins que les 101 requêtes.

J'ai essayé de mettre dans modela.object.select_Related (). Tout () Mais cela ne semblait avoir aucun effet.

Merci


0 commentaires

3 Réponses :


2
votes

Django Orm est une bonne chose, mais certaines choses sont mieux à faire manuellement. Vous pouvez importer un curseur de connexion et exécuter SQL brut dans une requête unique.

SELECT * FROM appname_modela INNER JOIN appname_modelb ON appname_modela.id=appname_modelb.modela_link_id


2 commentaires

Je sais que lorsque vous utilisez SQL brut, vous n'obtenez pas un objet retourné, alors savez-vous de tout moyen de convertir les résultats en un objet Django


Actuellement, vous ne pouvez pas créer des résultats SQL bruts dans Django QuerySet



1
votes

La raison .Select_Related () n'a pas fonctionné, est-ce que .Select_Related () est utilisé pour suivre les clés étrangères. Votre modèle n'a pas de clé étrangère pour modéliser. Sa modélisation qui a une clé étrangère pour modeler. (Donc, une instance MODERNA peut avoir plusieurs instances ModelB liées à elle).

Vous pouvez l'utiliser pour le faire dans 2 requêtes et un peu de code Python: xxx


0 commentaires

7
votes

Comme indique OFRI, select_related ne fonctionne que sur les relations vers l'avant, non inverse.

Il n'y a pas de place intégrée pour suivre automatiquement les relations inverse dans Django, mais voir Mon article de blog pour une technique pour le faire raisonnablement efficacement. L'idée de base est d'obtenir tous les objets associés pour chaque article à la fois, puis associez-les manuellement avec leur élément associé - vous pouvez donc le faire dans 2 requêtes plutôt que n + 1.


0 commentaires