Django 有抽象基类的 ManyToMany 关系 - 不可能,但有没有更好的办法?

3 投票
2 回答
2758 浏览
提问于 2025-04-16 04:44

给定以下模型:

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

在这个例子中,我想把一个系统管理员和很多机器关联起来,这些机器可以是实例、物理机器或虚拟机器。我知道不能在一个抽象基类上使用多对多关系,但我在想有没有比在系统管理员上为每个模型单独设置一个多对多字段更好的方法?在这个小例子中这样做还可以接受,但如果有超过两个子类,或者还有其他模型需要和这个“基”类关联,那就会变得更复杂,需要管理的东西也会增多。

谢谢 :)

2 个回答

2

你有没有想过使用通用关系,这可以通过内容类型框架来实现呢?

3

更新:我已经更新了解决方案,现在一个管理员可以管理多台机器,而一台机器也可以有多个管理员。

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

撰写回答