2009-08-12 6 views
0

Comment faire une longue requête? Y a-t-il moyen de l'optimiser? je ferais requête longue et compliquée:Très longue requête

all_accepted_parts = acceptedFragment.objects.filter(fragmentID = fragment.objects.filter(categories = fragmentCategory.objects.filter(id=1))) 

mais cela ne fonctionne pas, je reçois:

Error binding parameter 0 - probably unsupported type. 

Je serai reconnaissant pour tout soupçon comment je pourrais l'optimiser ou de résoudre bien sûr trop - plus reconnaissant :)

+0

Bien sûr, les filelds de tous les modèles sont corrects – IProblemFactory

+2

Votre principal problème est probable que le filtre() retourne un QuerySet, qui est effectivement une liste d'objets. Essayez "categories__in = fragmentCategory ... etc". Une requête imbriquée comme celle-ci n'est presque jamais nécessaire si vos modèles sont correctement liés. Si vous pouvez publier les définitions de modèle elles-mêmes, nous pouvons vous aider à optimiser la requête. –

+0

@Jarret Hardie, peut-être que vous devriez faire une réponse. –

Répondre

4

Si cela ne fonctionne pas, vous ne pouvez pas l'optimiser. Commencez par le faire fonctionner. À première vue, il semble que vous ayez des concepts vraiment différents sur les champs, les relations et l'égalité/l'appartenance. D'abord allez sur les docs, et construisez votre requête morceau par morceau sur le shell python (probablement de l'intérieur).

Juste un coup de feu dans l'obscurité:

all_accepted_parts = acceptedFragment.objects.filter(fragment__in = fragment.objects.filter(categories = fragmentCategory.objects.get(id=1))) 

ou peut-être:

all_accepted_parts = acceptedFragment.objects.filter(fragment__in = fragment.objects.filter(categories = 1)) 
+0

fragmentID__in (...) fonctionne, merci :) – IProblemFactory

4

Comme d'autres l'ont dit, nous avons vraiment besoin de modèles, et une explication de ce que vous essayez réellement atteindre.

Mais il semble que vous souhaitiez effectuer une recherche de table associée. Plutôt que d'obtenir tous les objets liés dans une requête imbriquée distincte, vous devez utiliser la syntaxe de modèle connexe de Django pour faire la jointure au sein de votre requête.

Quelque chose comme:

acceptedFragment.objects.filter(fragment__categories__id = 1) 
+0

Wow, je ne connais pas cette syntaxe cool, thx;> – IProblemFactory

Questions connexes