Может ли 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.

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