Проверьте, присутствует ли каждое значение в списке в заданной таблице модели 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)
Вернуться на верх