Django-manytomy关系与抽象基不可能,但是有更好的方法吗?

2024-10-01 13:43:38 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到以下型号:

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个系统管理员与许多机器联系起来——不管是实例、物理机器还是虚拟机。我知道我不能有一个抽象基的manytomy,但是我想知道是否有更好的方法来实现这一点,而不仅仅是在sysadmin上为每个模型单独设置一个manytomy字段?在这个小例子中,这是可以容忍的,但是如果你有两个以上的子类,或者如果有其他模型需要与“基类”相关,那么它就变得更需要管理了。在

谢谢:)


Tags: 模型机器modelmodelslengthmaxclass例子
2条回答

您是否考虑过使用contenttypes框架的generic relationship?在

编辑:我已经更新了源代码,因此一个管理员可以有多个计算机,一个计算机可以有多个管理员:

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

相关问题 更多 >