Как я могу представить это в модели Django? - PullRequest
0 голосов
/ 06 ноября 2010

У меня возникают проблемы с выяснением, каковы должны быть отношения с этим:

class Airport(models.Model):
    airlines = models.ManyToManyField(Airline)

class Airline(models.Model):
    terminal = models.CharField(max_length=200)

Проблема в том, что каждая авиакомпания связана с отдельным терминалом в зависимости от того, какой аэропорт запрашивается, поэтому терминал может 'просто статичный текст.

Кто-нибудь знает, как лучше всего это моделировать?

Спасибо

Ответы [ 3 ]

3 голосов
/ 06 ноября 2010

Удивлен, что есть так много разных ответов, я думаю, у каждого из них есть свои предпочтения. Вот как я это сделаю:

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')

В практическом плане данные будут вести себя в основном одинаково. Однако можно привести аргумент, что концептуальное представление о терминале, имеющем «Авиалинии», имеет больше смысла, чем у конкретной авиакомпании, имеющей терминалы. В конце концов, авиакомпания не содержит терминалов, но каждый терминал содержит эти авиакомпании.

0 голосов
/ 06 ноября 2010

class Airport(models.Model): airlines = models.ManyToManyField(Airline) terminal = models.CharField(max_length=200)

Я думаю, что это решило бы вашу проблему, используя только один класс

0 голосов
/ 06 ноября 2010
class Airport(models.Model):
    airlines = models.ManyToManyField(Airline, through=Terminal)

class Terminal(models.Model):
    terminal = models.CharField(max_length=200)

class Airline(models.Model):
    terminal = models.ForeignKey(Terminal)
    airport = models.ForeignKey(Airport)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...