Пользовательское поле поиска Django вызывает ошибку EmptyResultSet при передаче пустого набора
Я пытался реализовать поле поиска not_in, но оно генерирует запрос, отличный от ~Q. При запросе по списку идентификаторов, таких как: ids = [1, 2, 3, 4]
оба моих варианта not_in
и ~Q
дают одинаковый набор запросов, хотя их сгенерированный SQL отличается. Проблема, которую я обнаружил в своей реализации, заключается в том, что, например, запрос к пустому списку empty_list
~Q(id__in=empty_list)
вернет все строки, чьи идентификаторы не находятся в empty_list
, в данном случае все строки. Но в моей реализации возвращается пустой набор запросов
Код вышеуказанной реализации для справки
from django.db.models.lookups import In as LookupIn
@Field.register_lookup
class LookupNotIn(LookupIn):
"""
Acts as opposite to `__in`
"""
lookup_name = "not_in"
def as_sql(self, compiler, connection):
lhs, params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params.extend(rhs_params)
return "%s NOT IN %s" % (lhs, rhs), params
Он генерирует другой SQL для ~Q:
In [28]: print(ShopItem.objects.filter(~Q(id__in=deleted_ids)).query)
SELECT "shop_shopitem"."id", "shop_shopitem"."bakery_id", "shop_shopitem"."name", "shop_shopitem"."is_deleted", "shop_shopitem"."is_visible", "shop_shopitem"."number", "shop_shopitem"."description", "shop_shopitem"."special_information" FROM "shop_shopitem" WHERE NOT ("shop_shopitem"."id" IN (5c6a4164-252a-4aa5-abc1-62cebbc3119a, 6dcbc509-435e-4ccc-a6fd-6a48c652278f, f647ceac-34dd-4e1a-8fcd-ebb255b7d6f9, a1be4bc9-0a10-447f-8215-94df18c53fe2)) ORDER BY "shop_shopitem"."name" ASC
In [29]: print(ShopItem.objects.filter(id__not_in=deleted_ids).query)
SELECT "shop_shopitem"."id", "shop_shopitem"."bakery_id", "shop_shopitem"."name", "shop_shopitem"."is_deleted", "shop_shopitem"."is_visible", "shop_shopitem"."number", "shop_shopitem"."description", "shop_shopitem"."special_information" FROM "shop_shopitem" WHERE "shop_shopitem"."id" NOT IN (5c6a4164-252a-4aa5-abc1-62cebbc3119a, 6dcbc509-435e-4ccc-a6fd-6a48c652278f, f647ceac-34dd-4e1a-8fcd-ebb255b7d6f9, a1be4bc9-0a10-447f-8215-94df18c53fe2) ORDER BY "shop_shopitem"."name" ASC
Моя вторая реализация, которая фактически генерирует тот же SQL, что и ~Q:
@Field.register_lookup
class LookupNotIn(LookupIn):
"""
Acts as opposite to `__in`
"""
lookup_name = "not_in"
def as_sql(self, compiler, connection):
lhs, params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params.extend(rhs_params)
return "NOT (%s IN %s)" % (lhs, rhs), params
Но при передаче пустого набора/списка в следующем виде:
print(ShopItem.objects.filter(id__not_in=[]).query)
возникает ошибка:
/usr/local/lib/python3.8/site-packages/django/db/models/sql/where.py in as_sql(self, compiler, connection)
97 return '', []
98 else:
---> 99 raise EmptyResultSet
100 if full_needed == 0:
101 if self.negated:
EmptyResultSet:
Есть ли какой-нибудь обходной путь?