我的例子(我知道这在技术上并不正确,只是一个例子):
class ipAddy(models.Model):
network=models.ForeignKey(network)
ipAddy=models.IPAddressField(foo)
class device(models.Model):
hostname=models.CharField(foo)
foo=models.CharField(bar)
bar=models.CharField(foo)
class Meta:
abstract = True
class linuxServer(device):
linuxInfo - models.CharField(foo)
class macServer(device):
macInfo = models.CharField(foo)
我的目标:
对于每个基于设备的模型,与ipAddy模型具有多对一关系。在现实世界中说:我希望每种类型的服务器或设备都能够拥有多个IP地址。
在Django 1.2中实现这一目标的最佳方法是什么?
赞赏所有建设性的想法。
答案 0 :(得分:1)
最明显的方法是在抽象device
类中添加多个到多个字段。像这样:
class device(models.Model):
hostname=models.CharField(foo)
foo=models.CharField(bar)
bar=models.CharField(foo)
ip_addresses=models.ManyToManyField(ipAddy) # <=== m2m
class Meta:
abstract = True
上述结构假设您不希望存储具有多对多关系的任何其他信息。
如果你做想要为每个多对多关系附加更多数据,那么你可以使用intermediary table。使用抽象类无法完成此操作。它必须在儿童模型级别完成。例如,
class linuxServer(device):
linuxInfo = models.CharField(foo)
ip_addresses=models.ManyToManyField(ipAddy,
through='LinuxIPAssociation') # <=== m2m
class Meta:
abstract = True
class LinuxIPAssociation(models.Model):
device = models.ForeignKey(linuxServer)
ip_addy = models.ForeignKey(ipAddy)
custom_field_1 = models.CharField(...)
custom_field_2 = models.IntegerField(...)
# Similarly for Mac also.
上述原因是,在使用中间表时,您需要两个模型的外键,而Django不允许您向抽象模型类声明外键。因此,您必须自己声明两个独立的中间模型。
PS:你使用小写的类名是困扰我的。停止和停止!