Django ORM Как заставить использовать LEFT JOIN для иностранного ключа

Еще один вопрос о том, "Как не использовать необработанные запросы?"

У меня есть две модели:

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    soname = models.CharField(max_length=100)
    group = models.ForeignKey('Group', on_delete=models.PROTECT)

class Group(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)

Только один User с id=5 имеет Группу (это важно).

Мне нужно реализовать запрос следующим образом (используя LEFT JOIN):

SELECT * FROM User
LEFT JOIN Group ON Group.id = User.category
WHERE
    User.name LIKE '%test%' OR
    User.soname LIKE '%test%' OR
    Group.name LIKE '%test%'

А я хочу получить все записи, даже с пользователями без групп.

Но если я попытаюсь использовать это:

_res = User.objects.filter(
    Q(name__icontains='test') |
    Q(soname__icontains='test') |
    Q(group__name__contains='test')
)

Я получаю только одну запись с id=5, потому что ORM генерирует запрос с INNER JOIN.

Может ли кто-нибудь сказать мне, есть ли простой способ заставить Django ORM использовать LEFT JOIN без создания сложных конструкций, написания собственного конструктора запросов и использования необработанных запросов?

Вернуться на верх