Можно ли объединить QuerySets? - PullRequest
5 голосов
/ 13 декабря 2011

После поиска в базе данных я получаю массив наборов запросов.Я хотел объединить эти наборы запросов так, как мы можем сделать с элементами списка.Возможно ли это или, может быть, есть вообще лучший способ сделать это?Конечной целью здесь является получение набора запросов для строк таблицы, которые содержат один из набора строк в поле.

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]

ОБНОВЛЕНИЕ: Найден мой собственный ответ (что-то о написаниивопрос возможно)

Просто

from itertools import chain

, затем замените

myQuerySet = myQuerySet + myQuerySetTwoD[j]

на

BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

Я думаю, что правильный способ сделать это - использовать оператор | (то есть, если QuerySet s того же типа):

qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
    qset_temp = MyModel.objects.filter(asn=filterString)
    qset = qset | qset_temp
0 голосов
/ 13 декабря 2011

Ваш код выглядит странно! Я понятия не имею, как это работает и что вы здесь делаете, но вот как я бы вместо этого сделал запрос:

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)

Как это работает?

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

Посмотрите и документы Django: Сложные поиски с Q объектом

Ваш метод с itertools приведет к множеству запросов к базе данных. С моим решением это будет один запрос с поиском OR в предложении WHERE.

Обновление:

Может быть, даже лучшим решением было бы что-то вроде этого:

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)

Я не понимаю, зачем вам эти внутренние петли ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...