10
votes

Django orm et frapper dB

Quand je fais quelque chose comme

i. objets = modèle.Object.all ()

et ensuite

ii. objets.filter (champ_1 = quelque_condition)

Je frappe dB chaque fois que sur l'étape 2 avec diverses conditions. Y a-t-il un moyen d'obtenir toutes les données en première action et de prendre soin du résultat?


0 commentaires

3 Réponses :


1
votes

Pourquoi ne faites-vous pas juste objs = modèle.Object.filter (champ = condition) ? Cela dit, une fois que la requête SQL est exécutée, vous pouvez utiliser des expressions Python pour effectuer un filtrage / traitement supplémentaire sans entraîner des hits de base de données supplémentaires.


0 commentaires

4
votes

Bien sûr, vous toucherez dB à chaque fois. Filtre () Transforme en instruction SQL qui est exécuté par votre dB, vous ne pouvez pas filtre sans le frapper. Donc, vous pouvez récupérer tous les objets dont vous avez besoin avec des valeurs () ou ou (modèle.Object.All ()) et, comme Zeekay suggéré, utilisez Python Expressions (comme liste similaire compréhensions) pour filtrage supplémentaire.


1 commentaires

ce n'est pas vrai. Vérifiez les liens de la réponse là-bas: Stackoverflow.com/a/5989752/4213969



16
votes

Vous n'allez réellement pas frapper le dB avant d'évaluer les QS, les requêtes sont paresseux code> strong> .

lire plus ICI STRY> . P> P> P> P> P> EDIT : p>

Après avoir répété votre question, il devient évident que vous demandiez comment prévenir les hits db lors du filtrage pour différentes conditions. P>

qs_l = list(qs)
qs1_l = [element for element in qs_l if element.some_field='some_value']
qs2_l = [element for element in qs_l if element.some_field='some_other_value']


5 commentaires

Merci une autre question. Puis-je appuyer sur dB sans convertir QuerySet en une liste? Ou peut-être que je peux convertir la liste à un queryset?


Vous ne pouvez pas convertir la liste en requête. Vous pouvez frapper DB plusieurs façons, ils sont énumérés dans le deuxième lien de la réponse de Dting.


Vous pouvez frapper la DB par les méthodes mentionnées dans le lien "En savoir plus ici", par exemple Itération, tranchant avec des partitions, etc. Cette réponse Stackoverflow.com/Questtions/1058135/... et la question connexe pourrait vous intéresser.


Comment savoir que je frappe dB avec mes requêtes?


django_debug_toolbar vous aidera à identifier les hits db