Нет необходимости делать это с FilteredRelation
, вы можете написать это следующим образом:
Subscription.objects.filter(
<b>email__id=</b><i>mail_id</i>
)
с mail_id
идентификатор объекта Email
, который выхотите фильтровать.
Django создаст запрос, который выглядит следующим образом:
SELECT subscription.id, subscription.name
FROM subscription
INNER JOIN email_subscriptions
ON subscription.id = email_subscriptions.subscription_id
WHERE email_subscriptions.email_id = <i>email_id</i>
В любом случае нет необходимости использовать LEFT OUTER JOIN
, так как вы проверяете, является ли mail_id
определенный id
, следовательно, INNER JOIN
приведет к тому же набору.
Обратите внимание, что вы используете ManyToManyField
, и что Django создает таблицу между двумя сущностями, но вы не можетедоступ к этой таблице возможен только при указании модели с параметром through
[Django-doc] .
Вы также можете аннотировать Subscription
s с помощьюis_subscribed
, например:
from django.db.models import Exists, OuterRef
Subscription.objects.annotate(
is_subscribed=Exists(
Email.subscriptions.through.objects.filter(
subscription_id=OuterRef('id'),
mail_id=<i>email_id</i>
)
)
)
Это приводит к следующему запросу:
SELECT subscription.*,
<b>EXISTS(</b>
SELECT U0.id, U0.email_id, U0.subscription_id
FROM email_subscriptions U0
WHERE U0.subscription_id = subscription.id AND U0.mail_id = <i>email_id</i>
<b>) AS is_subscribed</b>
FROM subscription