Может ли Django сделать этот запрос к нескольким таблицам в одном операторе?
Давайте упростим задачу. Допустим, у меня есть две модели:
class Man(models.Model):
# some fields
class Job(models.Model):
man = models.ForeignKey(Man)
# other fields
Вот, по моей логике, у некоторых мужчин может быть работа, у некоторых нет. Теперь я хочу сделать запрос, чтобы выбрать мужчин с информацией о том, есть ли у них работа.
Если я напишу запрос на языке SQL, то получится что-то вроде:
select m.*, j.id from man m left join job j on m.id=j.id where m.some_condition
Чтобы если j.id
равен null, то у человека нет работы. Как сделать этот запрос в Django ORM?
men_with_jobs = Man.objects.exclude(job_set=None)
.exclude(job_set=None)
- это, по сути, просто синтаксический сахар, чтобы сказать .filter(job_set__isnull=False)
(который как бы является экземпляром следующих обратных отношений), где job_set
- это неявное имя обратного отношения от Man
обратно к Job
foreignkey.
В результате вы получите набор запросов, содержащий только экземпляры Man
, на которые ссылается хотя бы один экземпляр Job
.