Проверьте, присутствует ли каждое значение в списке в заданной таблице модели Django в ОДНОЗНАЧНОМ запросе.
Допустим, я хочу реализовать эту общую функцию:
def do_exist(key:str, values:list[any], model: django.db.models.Model) -> bool
Во время ОДНОГО запроса проверяется, существуют ли все заданные значения в столбце модели с именем key
.
Я реализовал нечто подобное
from django.db.models import Exists
def do_exist(key, values, model):
chained_exists = (Exists(model.objects.filter(F(key)=value)) for value in values)
qs = model.objects.filter(*chained_exists).values("pk")[:1]
# Limit and values used for the sake of less payload
return len(qs) > 0
Он генерирует вполне корректный SQL запрос, но меня пугает то, что если я попытаюсь добавить оценивающий вызов метода к qs
, например .first()
вместо [:1]
или .exists()
, соединение MYSQL обрывается.
Есть ли у кого-нибудь более элегантный способ решения этой проблемы?
Если вы знаете, что передаете N
pks, то count()
запрос, отфильтрованный по этим pks, должен иметь ровно N
результатов.
def do_exist(model, pks):
return model.objects.filter(pk__in=pks).count() == len(pks)
qs = MyModel.objects.filter(id__in=pks)
Это дает вам набор запросов, к которому вы можете применить .all() и т.д.
В Django вы можете использовать запрос id__in с набором запросов для фильтрации набора запросов на основе списка идентификаторов.
results = Model.objects.filter(id__in = pks)
res = MyModel.objects.filter(id__in=pks)