Сложные запросы Django, связанные с Prefetch, Subquery и OuterRef

Ниже приведен набор вопросов.

    queryset = Contract.objects.select_related(
        "company",
        "user",
        "user__profile",
        "user__profile__address",
        "user__profile__address__living_country",
        "compensation__currency",
        "job",
        "benefit",
        "payment_details",
        "working_country",
        "work_permit",
    ).prefetch_related(
        Prefetch(
            "partner_fee__partner__partner_countries",
            queryset=CountryPartner.objects.annotate(contract_id=OuterRef("id")).all()
        )
    )

Мне нужно аннотировать то contract_id, чтобы отфильтровать то CountryPartner. Но там невозможно использовать OuterRef. Всегда требуется Subquery из django.models.

Идеально, я хочу сделать такой sql-запрос в Django ORM:

select cc.id, cc.email, cc.residency_type, dc.country_id from core_contract cc
    inner join public.core_partnerfee cp on cc.id = cp.contract_id
    inner join public.core_partnerprofile c on cp.partner_id = c.id
    inner join public.dicts_countrypartner dc on c.id = dc.partner_profile_id
    where dc.country_id=cc.working_country_id
      and dc.residency_type=cc.residency_type
      and dc.partner_profile_id=c.id order by cc.id; 

Если я использую подзапрос внутри фильтра CountryPartner, то он будет принимать CountryPartnerId, а не ID контракта. См. ниже, пожалуйста.

Prefetch(
    "partner_fee__partner__partner_countries",
   queryset=CountryPartner.objects.annotate(contract_id=SubQuery(Contract.objects.filter(id=OuterRef("id"))))
)

Итак, как быть? Django ORM не может этого сделать?

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