Немного непонятна конечная цель. Если просто глянуть на значение поля объекта - по какой-то причине нельзя - то можно в аннотированные поля добавить желаемое:
.annotate(
title_contains=Case(
When(
Q(title__icontains='test'),
then=V('True')
),
default=(V(False)),
output_field=BooleanField()
),
desc_contains=Case(
When(
Q(desc__icontains='test'),
then=V('True')
),
default=(V(False)),
output_field=BooleanField()
),
...
и в результате в полях title_contains, desc_contains, ...
будет прилетать булевое значение - в каком соответствующем поле было найдено нужное соответствие
for obj in result:
print(obj.title_contains) # триггернулось ли по title
print(obj.desc_contains) # триггернулось ли по desc