Django:忽略queryset中的__in类型过滤器,如果它搜索的是空列表



拥有以下代码序列:

queryset = self.filter(
brand_id__in=(
UserObjectPermission.objects.filter(
content_type=brand_ctype,
user=user,
).values_list('object_pk')
)
)

如果没有UserObjectPermission对象匹配过滤器content_type=brand_ctype, user=user,那么最终结果将是空queryset,因为brand_id __in将在[empty queryset]中搜索。

但我需要相反的。如果此过滤器(content_type=brand_ctype, user=user)没有userobjectpermission对象,则返回所有对象,即忽略此过滤器(

)。
brand_id__in=(UserObjectPermission.objects.filter(
content_type=brand_ctype,
user=user,
).values_list('object_pk')
)

我需要brand_id__in过滤器只有在查询集中至少有一个对象时才运行。

您可以尝试使用OR (|)运算符

from django.db.models import Q, Exists
brands_qs = UserObjectPermission.objects.filter(
content_type=brand_ctype,
user=user,
).values_list('object_pk')
queryset = self.filter(
Q(brand_id__in=brands_qs) | ~Exists(brands_qs)
)

您可以检查查询集是否包含任何项:

brands = UserObjectPermission.objects.filter(
content_type=brand_ctype,
user=user,
).values_list('object_pk')
ifbrands:
queryset = queryset.filter(brand_id__in=brands)

最新更新