Задать вопрос
@iegor

Как сформировать left outer join в orm?

Необходимо сделать простенький запрос:
S.objects.raw('select app_s.name, app_t.name as t from app_s LEFT OUTER JOIN app_t ON app_s.id=app_t.s_id')
### где у t внешний ключ к s

Возможно ли средствами стандартной ORM Django?
Задача: выбрать все s, t, если для данного s не существет t получить s, None, обратная ситуация невозможна.
  • Вопрос задан
  • 1130 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Django: создание backend-приложений
    7 недель
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
class S(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название')


class T(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название')
    s = models.ForeignKey(S)

Вариант 1
>>> print(S.objects.all().values('name', 't__name').query)
SELECT "core_s"."name", "core_t"."name" FROM "core_s" LEFT OUTER JOIN "core_t" ON ("core_s"."id" = "core_t"."s_id")

Вариант 2
print(S.objects.all().annotate(t_name=F('t__name')).query)
SELECT "core_s"."id", "core_s"."name", "core_t"."name" AS "t_name" FROM "core_s" LEFT OUTER JOIN "core_t" ON ("core_s"."id" = "core_t"."s_id")
# тут на выходе будут экземпояры модели S, но стоит учитывать что при таком запросе они могут дублироваться для разных значений t.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы