Использовать запрос 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
.