Reputation: 4742
After a search of a database I end up with an array of querysets. I wanted to concatenate these queryset somewhat like we can do with list elements. Is this possible or maybe there an altogether better way to do this? The end goal here is to get queryset for rows of table that contain one of a set of strings in a field.
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]
UPDATE: Found my own answer (something about writing the question down maybe)
Just
from itertools import chain
then replace
myQuerySet = myQuerySet + myQuerySetTwoD[j]
with
BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])
Upvotes: 6
Views: 7766
Reputation: 2454
I think the proper way to do that is to use the |
operator (that is, if the QuerySet
s are of the same type):
qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
qset_temp = MyModel.objects.filter(asn=filterString)
qset = qset | qset_temp
Upvotes: 5
Reputation: 14497
Your code looks weird! I have no idea how does it work and what you are doing here, but here is how I would do the query thing instead:
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)
How does it work?
Blagh.objects.filter(Q(smth='A') | Q(smth='B'))
will generate query which looks like:
SELECT ... from blagh WHERE smth = 'A' OR smth = 'B'
Take a look and django docs: Complex lookups with Q
object
Your method with itertools
will result in many queries to database. With my solution it will be one query with OR
lookup in WHERE
clause.
Maybe even better solution would be something like this:
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)
I fail to understand why do you need that inner loops...
Upvotes: 0