2010-09-11 12 views
0

mon exemple (je sais que ce n'est pas techniquement correct, il est juste un exemple):django relations multiples à modèle de données unique

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) 

Mon objectif:

Pour chaque modèle basé sur un périphérique d'avoir un grand nombre relation avec le modèle ipAddy. Dans le monde réel, parlez: Je voudrais que chaque type de serveur ou de périphérique puisse avoir plusieurs adresses IP.

Quel serait le meilleur moyen d'accomplir ceci dans Django 1.2?

Toutes les pensées constructives sont appréciées.

Répondre

1

La méthode la plus évidente consiste à ajouter un champ many to many à la classe abstraite device. Quelque chose comme ceci:

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 

La structure ci-dessus suppose que vous ne voulez pas stocker tout autre , des informations supplémentaires avec le nombre de plusieurs.

Si souhaitez ajouter plus de données à chaque relation plusieurs à plusieurs, vous pouvez utiliser un intermediary table. Cela ne peut pas être fait en utilisant la classe abstraite. Cela doit être fait au niveau du modèle enfant. Par exemple

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. 

La raison de ce qui précède est que vous avez besoin d'une clé étrangère à la fois les modèles lors de l'utilisation d'une table intermédiaire et Django ne vous permet pas de déclarer une clé étrangère à une classe de modèle abstrait. Par conséquent, vous êtes obligé de déclarer vous-même deux modèles intermédiaires distincts. PS: votre utilisation des noms de classe minuscules m'embête. Cessez et renoncez!

+0

Merci pour les pensées. Le ManyToManyField s'est construit, mais il aurait fallu que toutes les adresses IP soient définies dans la base de données, puis les faire défiler pour sélectionner la ou les adresse (s) que vous vouliez utiliser sur un périphérique donné. Juste pas une solution pratique. – jduncan

+0

La deuxième suggestion (merci encore) a une référence circulaire, n'est-ce pas? la classe linuxServer fait référence à la classe LinuxIPAssociation qui n'existe pas encore ... non? – jduncan

+0

'la classe linuxServer fait référence à la classe LinuxIPAssociation qui n'existe pas encore ... n'est-ce pas?': Correct. Et c'est pourquoi le nom de la classe est entre guillemets. Vous pouvez voir un exemple similaire dans les docs: http://docs.djangoproject.com/fr/dev/topics/db/models/#extra-fields-on-many-to-many-relationships –

Questions connexes