Как 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
и наоборот.