Python, Django: Запрос по объединенным моделям?

Внутри моего приложения у меня есть несколько моделей, например:

models.py:

class Company(models.Model):
    name = models.CharField(max_length=100)


class Coworker(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    company = models.ForeignKey(Company, null=False, blank=False, on_delete=models.CASCADE)

Как вы видите, Company может содержать одного, несколько или ни одного Coworker! Можно ли сделать запрос к Company, но при этом получать данные от подключенных Coworker? Например, что-то вроде этого:

id    |    Company    |    Coworker
1     |    Company_A  |    Coworker_A
2     |    Company_B  |    
3     |    Company_C  |    Coworker_B
4     |    Company_C  |    Coworker_C
5     |    Company_C  |    Coworker_D
6     |    Company_D  |    Coworker_E
7     |    Company_D  |    Coworker_F
8     |    Company_E  |    
9     |    Company_F  |    Coworker_G
10    |    Company_F  |    Coworker_H
...

Моя проблема в том, что я не могу сделать запрос на Coworker, потому что я не хочу пропустить те Companies, которые не имеют связанных данных!

Спасибо за помощь и хорошего дня!

Достаточно просто сделать запрос по компании и получить результаты для работников :

Company.objects.prefetch_related("coworker_set").all()

В результате вы получите список компаний, содержащий список их работников в атрибуте coworker_set. Он также заполнит эти атрибуты в одном запросе (в этом весь смысл prefetch_related).

Более конкретно, вот как можно использовать такой запрос :

for company in Company.objects.prefetch_related("coworker_set").all():
    print(company.name)
    for coworker in company.coworker_set.all():
        print(coworker.first_name)
        print(coworker.last_name)

Это гарантирует, что вы выполните итерацию по всем компаниям, а также по всем коллегам, и вы выполните итерацию по каждому из них только один раз (на самом деле, если бы вы запрашивали по коллегам, вы бы увидели некоторые компании несколько раз, а другие вообще не увидели бы).

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