Django中的模型关系

时间:2013-07-27 21:13:53

标签: django django-models foreign-keys relational-database django-database

我是Django和数据库的新手,在阅读了关于模型的Django文档后,我有以下问题: 假设我有3种型号:VehicleName,CarManufacturer和TruckManufacturer。我正在尝试创建一个数据库关系,其中CarMaunfacturer有很多VehicleNames,而且TruckManufacturer也有很多VehicleNames。这里有什么关系以及如何在Django中定义它?是否像在CarManufacturer和TruckManufacturer中定义models.ForeignKey(VehicleName)一样简单? 感谢。

from django.db import models

class CarManufacturer(models.Model):
    vehicle_name = models.ForeignKey(VehicleName)  # IS THIS CORRECT???
    # ...
    pass

class TruckManufacturer(models.Model):
    vehicle_name = models.ForeignKey(VehicleName)  # IS THIS CORRECT???
    # ...
    pass

class VehicleName(models.Model):
    # ...

2 个答案:

答案 0 :(得分:1)

完全按照您的描述进行操作:

  

我正在尝试创建一个数据库关系,其中CarMaunfacturer有很多VehicleNames,而且TruckManufacturer也有很多VehicleNames

您可以在VehicleName上为两个制造商型号创建一个可以为空的外键:

class CarManufacturer(models.Model):
    # field definitions here

class TruckManufacturer(models.Model):
    # field definitions here

class VehicleName(models.Model):
    car_manufacturer = models.ForeignKey(CarManufacturer, blank=True, null=True)
    truck_manufacturer = models.ForeignKey(TruckManufacturer, blank=True, null=True)

然后,CarManufacturerTruckManufacturer的实例可以通过vehiclename_set属性获取名称。

对于更高级的设计,我可能会尝试将共享制造商行为抽象为单个模型,然后使用多表继承:

class Manufacturer(models.Model):
    # shared car and truck manufacturer fields go here

class CarManufacturer(Manufacturer):
    # car manufacturer specific fields go here

class TruckManufacturer(Manufacturer):
    # truck manufacturer specific fields go here

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

有关详细信息,请参阅multi-table inheritance docs

答案 1 :(得分:0)

我认为您不了解制造商对车辆的关系属性。我认为您要展示的是某个Vehicle属于某个manufacturer

这种类型的关系实际上将在Vehicle类中定义为manufacturer类中的外键Vehicle

如果您在制造商下定义了许多车辆,您只需要将该属性重命名为car_model或类似的东西,您应该没事。

我认为你有足够的理解。请记住,外键只是一个表的属性,并且在建立关系之前不会对另一个表本身说什么。

如果你正在处理一个包含多个对象的更大关系,你应该考虑使用django documentation中描述的多对多字段。

他们有一个例子,说明文章如何有很多出版物:

class Publication(models.Model):
    title = models.CharField(max_length=30)

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ('title',)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.headline

    class Meta:
        ordering = ('headline',)