[英]How to add a `or` condition filter in this prefetch_related query filter?
我有一个像下面这样的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'
。
如何实现这一目标?
使用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 (...)
过滤器无法轻松满足查询条件,则可以通过将Q()
过滤器与|
组合使用,在OR
查询上进行构建 二进制OR运算符:
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')
)))
最后但并非最不重要的一点是,如果要在ipv4s
关系的ip
列上过滤问题,则无需在相同条件下进一步过滤预提取 ! 它将已经限于同一过滤器,因此仅使用它就足够了:
filter(ipv4s__ip__in=(ip, '1.1.1.1')).prefetch_related('ipv4s')
.prefetch_related('ipv4s')
将预取与filter()
返回的问题相关的IPv4Manage
对象,因此它们已被限制为相同的ip
列值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.