Как пишет @ReinstateMonica в своем ответе, начиная с фильтрации объектов Paragraph, это кажется самым простым подходом. Результат этого может быть использован для фильтрации документов. Если у вас есть только одно соответствующее текстовое поле, подход может выглядеть примерно так:
results = Document.objects.filter(
pk__in=Paragraph.objects.filter(
text__icontains='foo').values_list('document', flat=True)
)
Если ваша модель Paragraph содержит несколько текстовых полей, вы можете сначала объединить поля, а затем использовать тот же подход, поэтому:
from django.db.models import Concat
qs = Document.objects.filter(
pk__in=Paragraph.objects.annotate(
conc_text=Concat('text', 'text2') # all relevant text fields
).filter(
conc_text__icontains='foo'
).values_list(
'document', flat=True
)
)