Удивлен, что есть так много разных ответов, я думаю, у каждого из них есть свои предпочтения. Вот как я это сделаю:
class Airport(models.Model):
name = models.CharField(max_length=200)
class Airline(models.Model):
name = models.CharField(max_length=200)
terminals = models.ManyToManyField('Terminal', related_name='airlines')
class Terminal(models.Model):
name = models.CharField(max_length=200)
airport = models.ForeignKey('Airport', related_name='terminals')
Это допускает и предполагает следующие условия:
- Авиакомпания может присутствовать в одном или
больше терминалов в данном аэропорту
- Терминал может иметь более одного или нескольких
авиакомпании
- Терминал может существовать только в
один аэропорт
Обратите внимание, что в этой настройке аэропорты и авиакомпании всегда связаны косвенно через терминалы. Я думаю, что это особенность, а не ошибка, лично. В аэропортах всегда есть хотя бы один терминал, даже если терминалом является весь аэропорт.
Или
Вы можете посчитать более правильным, с логической точки зрения, создание таких моделей:
class Airport(models.Model):
name = models.CharField(max_length=200)
class Airline(models.Model):
name = models.CharField(max_length=200)
class Terminal(models.Model):
name = models.CharField(max_length=200)
airport = models.ForeignKey('Airport', related_name='terminals')
airlines = models.ManyToManyField('Airline', related_name='terminals')
В практическом плане данные будут вести себя в основном одинаково. Однако можно привести аргумент, что концептуальное представление о терминале, имеющем «Авиалинии», имеет больше смысла, чем у конкретной авиакомпании, имеющей терминалы. В конце концов, авиакомпания не содержит терминалов, но каждый терминал содержит эти авиакомпании.