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)
)