@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, обратная ситуация невозможна.
  • Вопрос задан
  • 1032 просмотра
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:31
1000 руб./за проект
17 апр. 2024, в 00:13
800 руб./за проект
17 апр. 2024, в 00:06
240000 руб./за проект