Как добавить фильтр условий `или` в этот фильтр запросов prefetch_related? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть код фильтра qs, как показано ниже:

qs2 = qs1.filter(ipv4s__ip=ip).prefetch_related(
            Prefetch('ipv4s', queryset=IPv4Manage.objects.filter(ip=ip)))

Теперь я хочу добавить логический фильтр OR в этот фильтр.

как добавить фильтр условий or в этот фильтр запросов?

Я имею в виду, я хочу добавить фильтр условия или подобный этому: он будет соответствовать этому

filter(ipv4s__ip=ip).prefetch_related(
            Prefetch('ipv4s', queryset=IPv4Manage.objects.filter(ip=ip)))

условию или будет ip='1.1.1.1'.

Как сделатьэто сбудется?

1 Ответ

0 голосов
/ 25 сентября 2018

Использовать запрос IN;вы в основном выбираете WHERE ip IN (<ip>, '1.1.1.1') здесь:

filter(ipv4s__ip__in=(ip, '1.1.1.1')).prefetch_related(
        Prefetch('ipv4s', queryset=IPv4Manage.objects.filter(ip__in=(ip, '1.1.1.1'))))

Я предполагаю, что вы хотите отфильтровать оба вопроса и связанных IPv4Manage объектов, которые вы предварительно выбираете здесь, поэтомув приведенном примере используются фильтры ipv4s__ip__in и ip__in.Если вы хотите отфильтровать, скажем, набор запросов предварительной выборки, измените его соответствующим образом.

В противном случае параметр queryset принимает стандартный экземпляр QuerySet, поэтому вы можете использовать стандартный синтаксис построения запроса с Q() объекты для создания более сложных фильтров.

Например, если ваш запрос не может быть легко удовлетворен с помощью фильтра IN (...), то построение на запросе OR работает с использованием фильтров Q()в сочетании с | оператором двоичного ИЛИ:

filter(Q(ipv4s__ip=ip) | Q(ipv4s__ip='1.1.1.1')).prefetch_related(
    Prefetch('ipv4s', queryset=IPv4Manage.objects.filter(
        Q(ip=ip) | Q(ip='1.1.1.1')
    )))

И последнее, но не менее важное: если вы фильтруете свои вопросы по столбцу ip отношения ipv4s, тогда вы не делаетеНеобходима дополнительная фильтрация предварительной выборки при тех же условиях !Это уже будет ограничено тем же фильтром, поэтому его должно быть достаточно просто:

filter(ipv4s__ip__in=(ip, '1.1.1.1')).prefetch_related('ipv4s')

.prefetch_related('ipv4s') будет предварительно выбирать IPv4Manage объекты, которые связаны с вопросами, которые filter() возвращено, поэтому они уже были ограничены теми же значениями столбца ip.

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