Python Django-Manytomy与抽象基的关系-不可能,但有更好的方法吗?
鉴于以下模型:Python Django-Manytomy与抽象基的关系-不可能,但有更好的方法吗?,python,django,orm,Python,Django,Orm,鉴于以下模型: 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
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字段?在这个小示例中,这是可以容忍的,但是如果您有2个以上的子类,或者如果您需要与“基类”相关的其他模型,那么它将变得更需要管理
谢谢:您考虑过使用该框架吗 编辑:我已经更新了解决方案,因此一个管理员可以有多台机器,一台机器可以有多个管理员:
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>]
但是我可以将许多*计算机附加到1个系统管理实例吗?使用ContentType,我必须为每台*机器创建多个系统管理员实例?我已经更新了解决方案,因此一个管理员可以有多台机器,一台机器可以有多个管理员。反转关系将适用于我的用例,谢谢各位。如果您发现我的答案有用,请使用绿色标记将其标记为正确。非常感谢。