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

kx7yvsdv  于 2022-12-14  发布在  Go
关注(0)|答案(2)|浏览(121)

具有以下代码序列:

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,则最终结果将是空查询集,因为brand_id __in将在[空查询集]中搜索。
但是我需要反过来,如果这个过滤器(content_type=brand_ctype, user=user)没有UserObjectPermision对象,那么返回所有对象,也就是忽略这个过滤器(

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

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

y1aodyip

y1aodyip1#

可以尝试使用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)
)
qaxu7uf2

qaxu7uf22#

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

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

if brands:
    queryset = queryset.filter(brand_id__in=brands)

相关问题