我是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):
# ...
答案 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)
然后,CarManufacturer
或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)
有关详细信息,请参阅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',)