Эквивалент запроса MYSQL в django
У меня есть проект django с 2 моделями wca и identifiers, я хочу обновить поле под названием 'secid' в модели identifiers, взятое из эквивалентного поля в модели wca, где код из модели identifiers соответствует полю isin в модели wca.
У меня есть рабочий sql код для этого, но я хотел бы преобразовать его в эквивалент django для лучшей практики. Мой sql запрос выглядит следующим образом:
UPDATE portfolio_identifier
left outer join product_wca on portfolio_identifier.code = product_wca.isin
SET
portfolio_identifier.SecID = case when product_wca.secid is not null then product_wca.secid else 0 end
WHERE
code_type = 'ISIN';
Буду благодарен за любую помощь в этом вопросе. Спасибо
Это должно работать с некоторыми изменениями в именах модели и полей.
from django.db.models import Case, Value, When, F
Identifiers.objects.filter(code_type = 'ISIN')
.update(
SecID=Case(
When(wca__secid__isnull=False, then=F("wca__secid"),
default=Value(0),
)
)
from django.db.models import OuterRef, Subquery, F, When, Case, Value, IntegerField
Identifier.objects.filter(code_type='ISIN').update(
secid=Subquery(
Wca.objects.filter(
isin=OuterRef('code')
).annotate(
secid_new=Case(
When(
secid__isnull=False,
then=F('secid')
),
default=Value(0),
output_field=IntegerField()
)
).values('secid_new').distinct()
)
)