【问题标题】:How can I represent this in a Django model?如何在 Django 模型中表示这一点?
【发布时间】:2010-11-06 20:40:55
【问题描述】:

我无法确定这应该是什么关系:

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

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

问题在于,每个航空公司都与不同的航站楼相关联,具体取决于请求的机场,因此终端不能只是静态文本。

有谁知道最好的建模方法是什么?

谢谢

【问题讨论】:

    标签: python django django-models data-modeling


    【解决方案1】:

    很惊讶有这么多不同的答案,我猜每个人都有自己的喜好。我就是这样做的:

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

    实际上,数据的行为基本相同。然而,有人可能会提出这样的论点,从概念上来说,考虑一个拥有“航空公司”的航站楼比拥有航站楼的给定航空公司更有意义。毕竟,航空公司不包含航站楼,但每个航站楼都包含这些航空公司。

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

        【解决方案3】:

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

        我认为只使用一个类就可以解决您的问题

        【讨论】:

          猜你喜欢
          • 2017-09-27
          • 2017-11-13
          • 2014-01-02
          • 1970-01-01
          • 2012-11-20
          • 2020-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多