2016-07-29 15 views
0

So habe ich queryset1 die ModelA von 2 Parametern filtert:Django: Loop Queryset innerhalb Queryset

queryset1 = ModelA.objects.all().filter(par1="X",par2="Y") 

Dann habe ich eine andere queryset2, Ich mag würde Modell B filtern, indem die Elemente greifen, die bereits von queryset1 gefiltert wurden und dass auch andere Parameter wie folgt vor:

queryset2 = ModelB.objects.all().filter(par3="X" for i in queryset,par4="Z") 

Meine Frage ist: gibt es eine Möglichkeit, eine queryset auf einem queryset auszuführen, die Sie bereits gemacht haben? Am Ende möchte ich die Objekte von ModelA und ModelB ziehen, die Par1 Par2 Par3 folgen. Wie würde ich das tun?

+1

Ich verstehe nicht, was Sie versuchen, können Sie uns Ihr Modell zeigen? Was ist die Beziehung zwischen 'ModelA' und' ModelB'? Was versuchst du mit 'for i in queryset' zu tun? –

+0

ModelA und ModelB haben einige der gleichen Objekte, aber einige verschiedene Objekte. Ich möchte die Objekte, die in beiden Modellen identisch sind, aufnehmen und dann einen Filter für diese Objekte erstellen. –

+0

bitte poste Beispiele von Modellen, so ist es ein wenig klarer – Justin

Antwort

1

es ist durchaus möglich, ohne eine for-Schleife zu erreichen. Der Nachteil der Verwendung einer for-Schleife besteht darin, dass Sie tatsächlich zwei Abfragen ausführen und die Ergebnisse für die erste abrufen. Wenn dies zu einer großen Anzahl von Zeilen führt, verbrennen Sie Ressourcen und verlangsamen die Antwortzeit.

queryset2 = ModelB.objects.all().filter(par3__in=queryset,par4="Z") 

Dies würde in einer Unterabfrage führen wie bei https://docs.djangoproject.com/en/1.9/ref/models/querysets/ erklärte

Sie auch eine queryset dynamisch die Liste der Werte anstelle der Bereitstellung eine Liste von Literalwerte verwenden kannst, um zu bewerten:

SELECT * FROM app_modelb where par3 IN (SELECT ...) 
1

Was können Sie tun, ist:

  1. Wenn par3 ist ein relation vom gleichen Typ des queryset1:

    queryset2 = ModelB.objects.all().filter(par3__in=queryset1, par4="Z") 
    
  2. Verwenden Sie die values_list('some_field', flat=True) Notation, wenn part3 kein relation ist

    queryset2 = ModelB.objects.all().filter(par3__in=queryset1.values_list('X', flat=True), par4="Z")