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
без создания сложных конструкций, написания собственного конструктора запросов и использования необработанных запросов?