django与单一数据模型的多重关系

时间:2010-09-11 05:08:04

标签: django django-models

我的例子(我知道这在技术上并不正确,只是一个例子):

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中实现这一目标的最佳方法是什么?

赞赏所有建设性的想法。

1 个答案:

答案 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:你使用小写的类名是困扰我的。停止和停止!