2 модели связаны с отношением «многие ко многим».
class Record():
working_on_record = models.ManyToManyField(
UserProfile, related_name="working_on_record", blank=True)
class UserProfile():
name = CharField...
UserProfile - это просто базовая модель пользователя.
Теперь я хочу запросить поиск записей и проверить, совпадают ли все ключевые слова, но если я это сделаю:
query = Q()
c1 = UserProfile.objects.filter(name__icontains='peter')
query.add(Q(working_on_record__in=c1), Q.AND)
c2 = UserProfile.objects.filter(name__icontains='john')
query.add(Q(working_on_record__in=c2), Q.AND)
set3 = list(models.Record.objects.filter(query))
Set3 пуст, несмотря на то, что есть запись, в которой работают два человека с именами "Джон Смит" и "Питер Паркер". Если я заменю «john» в c2 на «parker», я получу все записи, где над ним работает «peter parker».
Но если я соединю методы фильтра:
set4 = list(models.Record.objects
.filter(working_on_record__in=c1)
.filter(working_on_record__in=c2)
)
set4 не пустой и содержит запись, которую я хочу.
Можно ли изменить Q-запрос, чтобы я получил желаемое поведение?
Можно ли выполнить фильтрацию с помощью Q-запроса для одного отношения «многие ко многим» с различными значениями из разных объектов, связанных с AND?
Мне не нравится идея создания цепочки методов фильтра из-за множественного возможного использования Q-запроса, поэтому мне пришлось бы многократно повторять все запросы и объединять их в цепочку.