evolution evolution - 1 year ago 81
Python Question

Is it possible to concatenate QuerySets?

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)
for j in range(0,(len(myQuerySetTwoD)-1)):
myQuerySet = myQuerySet + myQuerySetTwoD[j]

UPDATE: Found my own answer (something about writing the question down maybe)


from itertools import chain

then replace

myQuerySet = myQuerySet + myQuerySetTwoD[j]


BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])

ski ski
Answer Source

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)
    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)

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

I fail to understand why do you need that inner loops...