Эквивалент запроса 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()
    )
)
Вернуться на верх