Frage Ist es möglich, QuerySets zu verketten?


Nach der Suche in einer Datenbank habe ich ein Array von Suchanfragen. Ich wollte diese Abfrage so etwas wie Listenelemente verketten. Ist das möglich oder gibt es einen besseren Weg? Das Endziel besteht darin, ein Abfrage-Set für Zeilen von Tabellen zu erhalten, die einen Satz von Strings in einem Feld enthalten.

for i in range(0,(searchDiff+1)):
    filterString = str(int(searchRange[0]) + i)
    myQuerySetTwoD.append(my.objects.filter(asn=filterString))
    for j in range(0,(len(myQuerySetTwoD)-1)):
        myQuerySet = myQuerySet + myQuerySetTwoD[j]

AKTUALISIEREN: Ich habe meine eigene Antwort gefunden (etwas über das Schreiben der Frage vielleicht)

Gerade

from itertools import chain

dann ersetzen

myQuerySet = myQuerySet + myQuerySetTwoD[j]

mit

BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])

5
2017-12-13 11:47


Ursprung


Antworten:


Dein Code sieht komisch aus! Ich habe keine Ahnung, wie es funktioniert und was du hier machst, aber hier würde ich stattdessen die Abfrage-Sache machen:

from django.db.models import Q

myQuery = Q()
for i in range(0,(searchDiff+1)):
    filterString = str(int(searchRange[0]) + i)
    myQueryTwoD.append(Q(asn=filterString))
    for j in range(0,(len(myQueryTwoD)-1)):
        myQuery = myQuery | myQueryTwoD[j]

myQuerySet = my.objects.filter(myQuery)

Wie funktioniert es?

Blagh.objects.filter(Q(smth='A') | Q(smth='B'))
  will generate query which looks like:
SELECT ... from blagh WHERE smth = 'A' OR smth = 'B'

Schau mal und django docs: Komplexe Lookups mit Q Objekt

Deine Methode mit itertools führt zu vielen Abfragen an die Datenbank. Bei meiner Lösung wird es eine Abfrage mit sein OR Nachschlagen in WHERE Klausel.

Aktualisieren:

Vielleicht wäre eine noch bessere Lösung in etwa so:

strings = []
for i in range(0,(searchDiff+1)):
    filterString = str(int(searchRange[0]) + i)
    strings.append(filterString)

my_query_set = MyModel.objects.filter(arn__in=strings)

Ich verstehe nicht, warum du diese inneren Schleifen brauchst ...


0
2017-12-13 12:00



Ich denke, der richtige Weg, dies zu tun, ist die Verwendung der | Operator (das heißt, wenn die QuerySets sind vom gleichen Typ):

qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
    qset_temp = MyModel.objects.filter(asn=filterString)
    qset = qset | qset_temp

5
2017-12-13 12:06