Django : Игнорируйте фильтр типа __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, то конечным результатом будет пустой кверисет, потому что brand_id __in будет искать в [пустом кверисете].

Но мне нужно обратное. Если для этого фильтра нет объекта UserObjectPermision (content_type=brand_ctype, user=user), то вернуть все объекты, то есть игнорировать этот фильтр (

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

Мне нужно, чтобы фильтр brand_id__in выполнялся, только если в наборе запросов есть хотя бы один объект

Надеюсь, что меня правильно поняли. Пожалуйста, помогите)

Вы можете проверить, содержит ли набор запросов какие-либо элементы:

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

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

вы можете попробовать оператор 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)
)
Вернуться на верх