我如何在Django模型中表示这一点?

2024-09-28 23:18:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难搞清楚和这个有什么关系:

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

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

问题是,每个航空公司都与不同的终端相关联,这取决于请求的机场,因此终端不能只是静态文本。你知道吗

有人知道最好的建模方法是什么吗?你知道吗

谢谢


Tags: 终端model关系modelslengthmaxterminalclass
3条回答
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)

奇怪的是有这么多不同的答案,我猜每个人都有自己的喜好。我会这样做:

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

这允许并假设以下条件:

  • 一家航空公司可以有一家或几家 给定机场的更多航站楼
  • 一个终端可以有多个 航空公司
  • 终端只能存在于 单一机场

请注意,在此设置中,机场和航空公司始终通过终端间接连接。我个人认为这是一个特性而不是一个bug。机场总是至少有一个航站楼,即使航站楼是整个机场。你知道吗

或者

从逻辑的角度来看,您可能认为这样创建模型更为正确:

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

实际上,这些数据的表现基本相同。然而,有人可以提出一个论点,认为一个航站楼拥有“航空公司”,在概念上比一个给定的航空公司拥有航站楼更有意义。毕竟,航空公司不包含终端,但每个终端都包含这些航空公司。你知道吗

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

我想用一节课就能解决你的问题

相关问题 更多 >