2010-06-29 7 views
0

Je travaille sur un outil de gestion d'inventaire serveur/centre de données. J'ai une classe pour définir un "périphérique" par défaut, qui est ensuite utilisé pour exprimer des périphériques personnalisés (serveurs linux, serveurs Windows, routeurs, commutateurs, etc.)Modèle django - relations entre modèles hérités?

J'ai également des modèles de données configurés pour exprimer les adresses IP dans un réseau. Ma question est, quelle serait la meilleure façon d'exprimer la relation entre tous les différents modèles d'appareils et le modèle d'adresse IPv4?

class device(models.Model): 
    '''the primary object. all types of networked devices are based on and inherit this class''' 
    STATUS_CHOICES = (('0', 'unknown'),('1','active'),('2','pending'),('3','inactive'),('4', 'inventory'),('5','mothballed'),('6','surplus'),) 

    '''technical information''' 
    hostname = models.CharField(max_length=45, unique=True, db_index=True, help_text="The published hostname for this device") 

    '''misc. information''' 
    description = models.TextField(blank=True, null=True, help_text="A free-form description field") 

    type = models.ForeignKey(deviceStatus, help_text="The classification for this device") 
    status = models.IntegerField(choices=STATUS_CHOICES, help_text="current status of device") 
    is_monitored = models.BooleanField(default=True, help_text="is the device monitored?") 
    date_added = models.DateTimeField(auto_now=True, help_text="Date and Time device is entered into Barrelhouse", editable=False) 
    warranty_expriry = models.DateField(help_text="Date Manufacturer warranty expires") 
    extended_warranty = models.BooleanField(help_text="Whether or not device has some extended warranty in addition to the manufacturer",default=False, validators=[validate_extended_warr]) 
    ext_warranty_expiry = models.DateField(help_text="Date Extended Warranty Expires", null=True) 
    account = models.ForeignKey(vendorAccount, help_text="account associated with this device") 

    class Meta: 
      abstract = True 

class deviceLinuxSystem(device): 
    '''a typcial linux system --- you can get as specific as you want to in various server and desktop types.''' 
    ip_address = generic.GenericRelation(ipv4address) 

    def get_absolute_url(self): 
      return "linux_devices/%i/" % self.id 

    def __unicode__(self): 
      return self.hostname 

    class Meta: 
      verbose_name = "Linux System" 
class deviceWindowsSystem(device): 
    '''a typical windws system''' 

    def get_absolute_url(self): 
      return "windows_devices/%i/" % self.id 

    def __unicode__(self): 
      return self.hostname 

    class Meta: 
      verbose_name = "Windows System" 


class ipv4address(models.Model): 
    '''a model to represent all used IPv4 addresses on networks''' 
    netIP = models.IPAddressField(help_text="associated address", verbose_name="IP Address", unique=True, db_index=True) 
    network = models.ForeignKey(network, help_text="Network this IP lives on") 
+0

Pour suivre les conventions de codage de Django, vous devez toujours nommer vos classes dans UpperCamelCase! –

Répondre

1

En se concentrant sur la question à:

My question is, what would be the best way to express the relationship between all of the various device models and the ipv4 address model?

je recommande d'ajouter dev = models.ForeignKey(device, related_name="address") (et peut-être un portNumber = models.PositiveSmallIntegerField(default=0)) à ipv4address. Un périphérique peut avoir plusieurs ports réseau, et donc plus d'une adresse IP, sauf si vous avez quelque chose qui impose une adresse à un hôte quel que soit le port (par exemple, filaire ou wifi).

Si vous ne garantissez qu'une seule adresse par hôte, vous préféreriez utiliser dev = models.OneToOneField(device, related_name="address").

+0

+1 Un Fk ou un OnetoOneKey semble approprié. Je ne vois pas pourquoi l'OP utilise une GenericRelation –

+0

Je ne sais pas pourquoi l'OP est 1) mettre 'hostname' dans' device', puisqu'un 'device' pourrait avoir plusieurs noms (souvent avec des serveurs), 2) mettre des garanties étendues avec le 'device' (je suppose que vous ne pouvez en acheter qu'un seul), ou 3) utiliser le' id' dans les URL, au lieu de 'hostname' ou un autre slug qui peut être changé plus tard si nécessaire. –

+0

parce que c'est un premier modèle de grattage que je pense à travers le processus. Merci pour l'apport, cependant. – jduncan