Как сделать запрос с несколькими различными объектами Q?

У меня есть модель предпочтений в моем приложении Django, и я пытаюсь написать запрос, который фильтрует элементы, у которых два предпочтения установлены определенным образом. Предпочтения хранятся по принципу "многие ко многим", поэтому каждый объект имеет несколько предпочтений, связанных с ним.

Для предпочтения 1, я могу проверить:

Team.objects.filter(teampreferencemodel__name='remind_morning', teampreferencemodel__raw_value='a')

Для предпочтения 2, я могу проверить:

Team.objects.filter(teampreferencemodel__name='remind_days_before', teampreferencemodel__raw_value='5')

Моя цель - получить пересечение этих двух запросов. Я думал, что могу сделать что-то вроде:

Team.objects.filter(Q(teampreferencemodel__name='remind_morning', teampreferencemodel__raw_value='a')),
                    Q(teampreferencemodel__name='remind_days_before', teampreferencemodel__raw_value='5'))

но похоже (я думаю), что Django пытается удовлетворить оба вопроса с помощью одной модели предпочтений команды, вместо того, чтобы найти ту, которая имеет по одному из них.

Есть ли способ оптимизировать этот запрос, с помощью Q или чего-то еще, или мне нужно просто прибегнуть к:

Team.objects.filter(teampreferencemodel__name='remind_morning', teampreferencemodel__raw_value='a').intersection(
     Team.objects.filter(teampreferencemodel__name='remind_days_before', teampreferencemodel__raw_value='5'))

или немного лучше:

Team.objects.filter(teampreferencemodel__name='remind_morning', teampreferencemodel__raw_value='a').filter(
  teampreferencemodel__name='remind_days_before', teampreferencemodel__raw_value='5'))

Просто кажется, что должен быть лучший способ...

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