Как сформировать запрос Django с произвольным количеством предложений OR? - PullRequest
1 голос
/ 15 марта 2020

Я использую Django 2.0 с Python 3.7. Я хочу написать запрос, который возвращает результаты, если поля содержат хотя бы одну из строк в массиве, поэтому я хочу настроить запрос ИЛИ. Я пробовал это

class CoopManager(models.Manager):
    ...
    # Meant to look up coops case-insensitively by part of a type
    def contains_type(self, types_arr):
        queryset = Coop.objects.all()
        for type in types_arr:
            queryset = queryset.filter(type__name__icontains=type)
        print(queryset.query)
        return queryset

Однако, это производит запрос, который объединяет предложения. Как выполнить вышеизложенное, но объединить все пункты с помощью ИЛИ вместо И?

Я использую MySql 5.7, но я хотел бы знать независимое от БД решение, если оно существует.

1 Ответ

1 голос
/ 15 марта 2020

Вы можете создать Q объект, который создает эту дизъюнкцию:

from django.db.models import Q

filter = Q(
    *[('type__name__icontains', type) for type in types_arr],
    <b>_connector=Q.OR</b>
)
queryset = Coop.objects.filter(filter)

Здесь filter - это Q объект, который является дизъюнкцией всех type__name__icontains=type фильтров.

...