Отношения Django ManyToMany с абстрактной базой - невозможны, но есть ли лучший способ? - PullRequest
2 голосов
/ 29 сентября 2010

Учитывая следующие модели:

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...

В этом примере я хотел бы связать 1 системного администратора со многими машинами - будь то экземпляр, PhysicalMachine или VirtualMachine. Я знаю, что не могу иметь ManyToMany с абстрактной базой, но мне было интересно, есть ли лучший способ добиться этого, чем просто иметь отдельное поле ManyToMany в sysadmin для каждой из моделей? В этом небольшом примере это может быть допустимо, но если у вас есть более 2 подклассов, или если есть другие модели, которые вам нужно связать с базовым классом, это становится чем-то большим для управления.

Спасибо:)

Ответы [ 2 ]

3 голосов
/ 29 сентября 2010

РЕДАКТИРОВАТЬ: Я обновил Soultion, так что один администратор может иметь много компьютеров, и один компьютер может иметь много администраторов:

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>]
2 голосов
/ 29 сентября 2010

Рассматривали ли вы родовые отношения , используя contenttypes framework?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...