如何在此prefetch_related查询过滤器中添加`或`条件过滤器?

时间:2018-09-25 10:01:18

标签: python django django-rest-framework

我有一个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 :(得分:2)

使用RecyclerView查询;您基本上是在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')))) 对象,因此IPv4Manageipv4s__ip__in过滤器在上面的示例中使用。例如,如果您只想过滤预取查询集,请进行相应调整。

ip__in参数采用标准的queryset实例,因此您可以使用standard query constructing syntax with Q() objects来构建更复杂的过滤器。

例如,如果使用QuerySet过滤器无法轻松满足查询条件,则可以通过结合使用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()列值。