当使用ForeignKey或ManyToMany时,与*模型的关系恰好是*

时间:2014-05-10 06:47:43

标签: python django django-models

有些东西让我对模型感到震惊,我猜一般是SQL表。

让我们假设你有这些模型:

class Manufacturer(models.Model):
    name = models.CharField()
    company_created = models.CharField()

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)

当您创建Car的实例时,请说明以下

civic = Car(manufacturer='honda')

几个问题:

  1. 当您创建Car实例时,您是否还要创建一个制造商实例作为副产品?或者“本田”是否已经作为一个实例存在。如果没有,是否有办法制作两者的实例,例如,一种形式。
  2. 我是否可以就'civic'打电话给与制造有关的事情?例如,我可以从市政实例中获取“company_created”数据吗?如果没有,为什么要首先考虑这种关系呢?
  3. 提前非常感谢。我非常感谢一个彻底的答案,所以我可以完全理解模型和关系。是的,我已经阅读了文档。

2 个答案:

答案 0 :(得分:1)

首先,要记住的是这些类是底层数据库表的表示。 Django模型中的ForeignKey字段表示数据库中的一对多关系,其中_id字段表示另一个表的ID。这些表本身是独立的,但是通过FK字段(以及相关的索引约束,如果数据库支持它们)链接。

也就是说,在您的Car模型manufacturer中是必填字段(因为您还没有将其定义为null=True)。因此,当您创建Car时,必须将其指向已存在的制造商 - 并且该制造商必须已经保存,以便Django可以使用ID填充基础manufacturer_id字段相关对象

因为Django知道两个对象之间的外键关系,所以在查询时可以使用它们。在SQL中,这将通过JOIN来完成:Django为您提供了一种特殊的语法,可以通过双下划线跨这些连接进行查询。因此,例如,如果你想获得1990年创建的制造商制造的所有汽车(假设你的company_created字段是什么意思),你会这样做:

Car.objects.filter(manufacturer__company_created='1990')

Django将其翻译成":

SELECT * from car JOIN manufacturer ON car.manufacturer_id=manufacturer.id WHERE manufacturer.company_created='1990';

如果您已经拥有" civic"实例,只是想访问相关数据,这是纯Python对象访问:civic.manufacturer是相关的制造商对象,因此您只需执行civic.manufacturer.company_created即可获取相关数据。同样,Django将其转换为数据库访问,但从您的角度来看,这是简单的对象组合。

请注意,本教程中完全解释了这一切,Poll和Choice之间的关系与您的制造商和汽车模型完全匹配。

答案 1 :(得分:0)

manufacturer需要作为实例存在。

您可以像这样创建car个实例:

manuf= Manufacturer(name='honda',company_created='Benz')
manuf.save()

civic = Car(manufacturer=manuf)

您可以通过以下方式从公民实例获取company_created数据:

civic.manufacturer.company_created