Django Admin过滤OneToOneField

时间:2019-03-26 16:13:29

标签: python django

我正在尝试构建一个应用程序来管理我们拥有的某些网络设备。但是我需要帮助来弄清楚如何为交换机和网卡创建模型。

所以我创建了3个模型:

  1. 与外键链接到设备的网卡。例如,server-dc01有一个网卡。
  2. 开关,这是我的开关。
  3. SwitchPort,在这里我可以创建端口并将它们链接到交换机。因此,如果一个交换机有24个端口,我需要创建24个交换机端口并将它们全部链接到我的交换机。有点烦人。我不知道这是不是最好的。

这是我现在拥有的型号:

class NetworkCard(models.Model):
    equipment = models.ForeignKey('Equipment', on_delete=models.CASCADE)
    attached_to_port = models.OneToOneField('SwitchPorts', on_delete=models.CASCADE, blank=True, null=True)
    def __str__(self):
        return self.name

class Switch(Equipment):
    number_of_ports = models.PositiveSmallIntegerField()

class SwitchPorts(models.Model):
    number = models.PositiveSmallIntegerField()
    switch = models.ForeignKey('Switch', on_delete=models.CASCADE)

因此,在admin中,我可以将网卡添加到设备,然后将该网卡“插入”到交换机端口。但是,当然,当我有10个带有48个端口的交换机时,下拉选择的时间太长。我尝试过raw_id_field,但它也不是用户友好的。

我想要的是admin这样的东西: -下拉菜单中选择开关 -第二个下拉菜单,在这里我可以选择之前选择的交换机上的端口,仅显示该交换机上的空闲端口。

因此,我的问题是:

  • 使用交换机端口模型的方式好吗?
  • 如果是,如何使两个选择项按我的意愿工作?
  • 如果没有,我该怎么办?

我也尝试没有交换机端口模型。因此,卡仅链接到交换机。在这种情况下,我可以添加一个数字(在PositiveSmallIntegerField中)以定义将卡插入交换机上的哪个端口。非常用户友好...但是我需要在交换机的端口上添加有关VLAN的信息。

有什么想法的人吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是django-smart-selects。该软件包可让您将模型链接在一起,以便在管理员中选择一个AJAX即可加载下一个可选选项。

对于您的模型-我不会使用字符串表示形式。您可以使用模型代替(即switch = models.ForeignKey(Switch, ...)。最后,除非您确定它是一个抽象类(我看不到),否则我不确定是否继承Equipment