Сложные запросы 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 не может этого сделать?