2010-09-29 7 views
2

Compte tenu des modèles suivants:Django ManyToMany relation avec base abstraite - pas possible, mais y at-il un meilleur moyen?

class BaseMachine(models.Model) 
    fqdn = models.CharField(max_length=150) 
    cpus = models.IntegerField() 
    memory = models.IntegerField() 

    class Meta: 
     abstract = True 

class PhysicalMachine(BaseMachine) 
    location = models.CharField(max_length=150) 


class VirtualMachine(BaseMachine) 
    hypervisor = models.CharField(max_length=5) 


class Sysadmin(models.Model): 
    name = models.CharField(max_length=100) 
    admin_of = models.ManyToManyField... 

Dans cet exemple, je voudrais vous raconter 1 sysadmin à de nombreuses machines - être les soit une instance ou PhysicalMachine ou VirtualMachine. Je sais que je ne peux pas avoir un ManyToMany avec une base abstraite, mais je me demandais s'il y avait une meilleure façon d'y parvenir que de simplement avoir un champ ManyToMany séparé sur sysadmin pour chacun des modèles? Dans ce petit exemple qui pourrait être tolérable, mais si vous avez plus de 2 sous-classes, ou s'il y a d'autres modèles que vous devez mettre en relation avec la classe 'base', cela devient quelque chose de plus à gérer.

Merci :)

Répondre

3

EDIT: Je l'ai mis à jour le soultion, si un administrateur peut avoir plusieurs machines et une machine peut avoir plusieurs admins:

class Sysadmin(models.Model): 
    name = models.CharField(max_length=100) 


class BaseMachine(models.Model): 
    fqdn = models.CharField(max_length=150) 
    cpus = models.IntegerField() 
    memory = models.IntegerField() 
    admins = models.ManyToManyField(Sysadmin) 

    class Meta: 
     abstract = True 

class PhysicalMachine(BaseMachine): 
    location = models.CharField(max_length=150) 


class VirtualMachine(BaseMachine): 
    hypervisor = models.CharField(max_length=5) 



In [1]: s1 = Sysadmin(name='mike') 

In [2]: s1.save() 

In [3]: m1 = PhysicalMachine(fqdn='test', cpus=1, memory=20, location='test') 

In [4]: m1.save() 

In [5]: m1.admins.add(s1) 

In [6]: m1.save() 

In [7]: m2 = VirtualMachine(fqdn='test', cpus=1, memory=20, hypervisor='test') 

In [8]: m2.save() 

In [9]: m2.admins.add(s1) 

In [10]: m2.save() 

In [11]: m1.admins.all() 
Out[11]: [<Sysadmin: Sysadmin object>] 

In [12]: m2.admins.all() 
Out[12]: [<Sysadmin: Sysadmin object>] 
+0

Mais pourrais-je attacher beaucoup * à 1 instance sysadmin de la machine? A l'aide de ContentType, je devrais créer plusieurs instances sysadmin pour chaque * machine? – Darren

+0

J'ai mis à jour la solution, donc un administrateur peut avoir plusieurs machines et une machine peut avoir de nombreux administrateurs. –

+0

Inverser la relation fonctionnera pour mon cas d'utilisation, merci les gars. – Darren