1

我是 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):
    # ...
4

2 回答 2

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)

然后,CarManufactureror的实例TruckManufacturer可以通过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)

有关完整详细信息,请参阅多表继承文档

于 2013-07-27T21:43:00.403 回答
0

我认为您不了解制造商与车辆的关系财产。我认为你试图表明的是,某物Vehicle属于某物manufacturer

这种类型的关系实际上会在类中定义为类中Vehicle的外键,称为。manufacturerVehicle

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

我认为您的理解已经足够好。请记住,外键只是一个表的属性,在建立关系之前不要谈论另一个表本身。

如果您正在处理更大的关系,使用多个对象,您应该考虑使用django 文档中描述的多对多字段。

他们有一个例子展示了一篇文章如何有许多出版物:

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',)
于 2013-07-27T21:21:50.773 回答