J'ai 2 modèles dans mon code Django: disent que Modela dispose de 100 enregistrements, tous peuvent ne pas avoir de liens vers ModelB P> maintenant dire que je Voulez-vous obtenir une liste de chaque enregistrement de modèle avec les données de ModelB P> Je ferais: p> puis pour obtenir les données de modelb je voudrais doivent faire p> Cependant, cela exécute une requête sur chaque instance de i. Faisant ainsi 101 questions à courir. P> 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. p> J'ai essayé de mettre dans Merci p> p> modela.object.select_Related (). Tout () code> Mais cela ne semblait avoir aucun effet. P>
3 Réponses :
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
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
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: p>
Comme indique OFRI, 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. P> select_related code> ne fonctionne que sur les relations vers l'avant, non inverse. p>