Как ORM фильтровать запрос со списком параметров?

У меня есть фильтр запроса

query_1 = Model.objects.filter(param = param)

Мне нужно отфильтровать этот список в другой ORM и вернуть true или flase только если все данные из запроса_1 есть во втором запросе. Например,

query_2 = AnotherModel.objects.filter(field__in=query_1)

возвращает True только если все объекты из списка query_1 есть в списке query_2.

Я не думаю, что это можно сделать, используя только ORM. Если field является foreignkey для Model:

def my_func(param):
  list_of_ids_1 = Model.objects.filter(param = param).values_list('id', flat=True)
  list_of_ids_2 = AnotherModel.objects.filter(field__in=list_of_ids_1).values_list('field_id', flat=True).distinct()

  return len(list_of_ids_1) == len(list_of_ids_2)

Предположим, что Model, AnotherModel таковы

class Model(models.Model):
    param=models.CharField(...)
    ...

class AnotherModel(models.Model);
    field = models.ForeignKey(Model, on_delete=...)  
    ...  
    

Тогда следующий запрос вернет только те Model, которые имеют соответствующие AnotherModel

result = Model.objects.filter(param=param, anothermodel__isnull=False)

но если вы хотите проверить результат filter(param=param) на наличие модели, которой нет в AnotherModel, вы должны сделать это вручную

exists = true
query_1 = Model.objects.filter(param = param)
for model in query_1:
    if not AnotherModel.objects.filter(field=model).exists():
        exists = false
        break

# if exists is true that means all of the query_1 obj is there in AnotherModel 

Вы можете проверить, существует ли какой-либо Model, для которого не существует AnotherModel с помощью:

not Model.objects.filter(anothermodel=None).exists()

если запрос возвращает True, то not … будет возвращать False и это означает, что все Model ссылаются на AnotherModel и наоборот.

Вернуться на верх