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