Каков предпочтительный метод для использования оператора OR в строке запроса?
Я пишу API с Django-tastypie. API, использующий строку запроса для фильтрации объектов.
Например: если я хочу найти клиентов с именем 'foo' в first_name, я передаю эту строку запроса конечной точке API для фильтрации:
myapi/customers/?first_name__icontains=foo
Для поиска клиентов, в имени которых есть "foo" И "bar" в фамилии:
myapi/customers/?first_name__icontains=foo&last_name__icontains=bar
Я хочу найти клиентов, у которых есть "foo" в имени или фамилии. Но я не знаю, как лучше указать фильтр OR в строке запроса.
Вариант: могу решить с использованием ||
в строке запроса и ее разборе на стороне сервера, как показано ниже, но я не знаю, что это предпочтительный метод:
myapi/customers/?first_name__icontains=foo||last_name__icontains=foo
Я видел API, которые используют строку запроса для фильтрации результатов, но я не нашел ни одной связанной статьи с выполнением ИЛИ фильтрации в строке запроса. Этот подход неверен? Если не;
Каков наилучший способ использовать оператор OR в строке запроса?
Примечание: джанго-лакомство __icontains
для поиска в базе данных, игнорируйте его:
last_name__icontains=foo
равно last_name ilike '%foo%'
в SQL.
1 ответ
Однако я не имею никакого опыта в области вкусных пирогов или запросов в Django, используя Q https://docs.djangoproject.com/en/dev/topics/db/queries/,
Так что везде, где в Delicious можно определить возвращаемый запрос.
Customer.objects.filter(Q(first_name__icontains='foo') | Q(last_name__icontains='bar'))
Примечание. Если объект соответствует обоим параметрам, этот объект будет возвращен дважды. Если это проблема, используйте.distinct(). Однако это дорогая БД.