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

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

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