ИЛИ запрос с зависанием объекта Q - PullRequest
0 голосов
/ 06 марта 2012

Я строю запрос, используя объект Q, но он зависает.

Когда я "И" фильтры вместе, запрос работает нормально. Вот пример:

School.objects.filter( Q(city__search='"orlando"'), Q(schoolattribute__attribute__name__search='"subjects"') )

Но когда я "ИЛИ" фильтрую вместе, запрос просто зависает, потому что я предполагаю, что слишком много нужно обработать:

School.objects.filter( Q(city__search='"orlando"') | Q(schoolattribute__attribute__name__search='"subjects"')

Мне интересно, что именно здесь происходит и что я могу сделать, чтобы смягчить это. Почему запрос работает при использовании «И», но не при использовании «ИЛИ»?

РЕДАКТИРОВАТЬ: Хороший совет @psagers. Таким образом, получается, что запрос AND получает два INNER JOIN, а запрос OR - два LEFT OUTER JOIN.

1 Ответ

1 голос
/ 07 марта 2012

Учитывая вашу ситуацию, я приму следующее:

  1. У вас действительно большой набор данных
  2. Вы не хотите получать слишком много записей

Для оптимизации вашего кода вам, вероятно, будет лучше использовать два запроса:

schools_by_city = School.objects.filter(city__search='"orlando"')
schools_by_attribute_city = School.objects.filter(schoolattribute__attribute__name__search='"subjects"')
result = set(schools_by_city).union(set(schools_by_attribute_city))

Это , вероятно, будет лучше, чем ваш исходный запрос (потому что вы можете использоватьВНУТРЕННЕЕ присоединиться), но вы должны проверить это.Если мои предположения неверны, вам, вероятно, следует переосмыслить свою структуру БД (т.е. использовать специализированный инструмент для поиска вместо полного текста MySQL, переосмыслив SchoolAttribute, что угодно, что плавает на вашей лодке).

...