Modèle de requête conjointe

Filter () vous donnera toujours un QuerySet, même si un seul objet correspond à la requête-dans ce cas, il s`agit d`un QuerySet contenant un seul élément. $query = nouvelle requête; $query-> Select ([`tbl_user. nom_utilisateur en tant que nom`, `tbl_category. type comme catégorie`, `tbl_type. Name As type`])-de (`tbl_user`)-> leftJoin (`tbl_category`, `tbl_category. CreatedBy = tbl_user. userid`)-> leftJoin (`tbl_type`, `tbl_type. ID` = tbl_ User. typeID`)-> Limit (2); En utilisant la méthode d`éloquent First (), nous pouvons également nous assurer que cette requête est aussi efficace que possible; une fois qu`il trouve un seul rôle qui satisfait aux exigences énoncées dans la requête, il retournera le role_name instantanément. Cela signifie que la même requête de base de données sera exécutée deux fois, doublant efficacement votre charge de base de données. En outre, il est possible que les deux listes peuvent ne pas inclure les mêmes enregistrements de base de données, car une entrée peut avoir été ajoutée ou supprimée dans la fraction de seconde entre les deux demandes. Si vous avez apprécié ces conseils éloquent, consultez mon cours en ligne éloquent: expert Level et apprenez à créer des relations, à interroger efficacement les données et à explorer les fonctionnalités éloquentes que vous ne connaissez peut-être pas. Il s`agit d`une jointure simple dans laquelle le résultat est basé sur des données appariées selon la condition d`égalité spécifiée dans la requête SQL.

Toutefois, si le jeu de requêtes complet a déjà été évalué, le cache sera vérifié à la place: ici, nous rejoignons les deux tables à l`aide du mot clé Join, et en spécifiant la clé à utiliser lors de la jointure des tables dans les clients. customer_id = Orders. customer_id ligne suivant l`instruction JOIN. Voici le résultat de la requête SQL ci-dessus, qui comprend deux commandes placées par Thomas Jefferson (customer_id = 3): les Querysets ne cache pas toujours leurs résultats. Lors de l`évaluation d`une partie seulement du jeu de requêtes, le cache est vérifié, mais s`il n`est pas renseigné, les éléments retournés par la requête suivante ne sont pas mis en cache. En particulier, cela signifie que la limitation du jeu de requête à l`aide d`une tranche de tableau ou d`un index ne remplit pas le cache. Les QuerySets sont paresseux – l`acte de création d`un QuerySet n`implique aucune activité de base de données. Vous pouvez empiler des filtres ensemble toute la journée, et Django n`exécutera pas réellement la requête tant que le QuerySet n`est pas évalué. Jetez un oeil à cet exemple: pour trouver toutes les entrées où la notation de l`entrée est inférieure à la somme du nombre de Pingback et le nombre de commentaires, nous émettionnons la requête: Si vous savez qu`il n`y a qu`un seul objet qui correspond à votre requête , vous pouvez utiliser la méthode get () sur un gestionnaire qui renvoie directement l`objet: ce bloc de code requiert deux appels distincts à la base de données qui ne peuvent pas être exécutés simultanément; le premier doit revenir avant que la seconde puisse commencer.

Améliorons ceci en combinant les deux requêtes en une seule requête. Vous pouvez composer des déclarations de complexité arbitraire en combinant des objets Q avec le & et | opérateurs et utiliser le regroupement entre parenthèses. En outre, les objets Q peuvent être annulés à l`aide de l`opérateur ~, ce qui permet des recherches combinées qui combinent à la fois une requête normale et une requête annulée (NOT): vous pouvez également utiliser la notation de soulignement double pour étendre les relations dans un objet F (). Un objet F () avec un trait de soulignement double introduira les jointures nécessaires pour accéder à l`objet connexe. Par exemple, pour récupérer toutes les entrées où le nom de l`auteur est le même que le nom du blog, nous pourrions émettre la requête: Voici quelques exemples d`autres actions qui se traduira par l`ensemble du jeu de requêtes en cours d`évaluation et donc remplir le cache: dans le deuxième exemple , le premier filtre restreint le jeu de requêtes à tous les blogs liés aux entrées avec „Lennon” dans le titre. Le deuxième filtre restreint l`ensemble des blogs à ceux qui sont également liés à des entrées qui ont été publiées dans 2008. Les entrées sélectionnées par le second filtre peuvent ou non être les mêmes que celles du premier filtre. Nous filtrons les Articles de blog avec chaque instruction de filtre, pas les éléments d`entrée. Par exemple, l`obtention répétée d`un certain index dans un objet queryset interrogent la base de données à chaque fois: je veux afficher des Articles avec leur nom de catégorie au lieu de category_id et nom_utilisateur au lieu de user_id j`essaie comme ces requêtes c`est du travail! Et il ya encore plus, j`ai énuméré les plus intéressants, pour plus s`il vous plaît vérifier le code de la classe de modèle abstraite par défaut et vérifier tous les traits utilisés.