gpt4 book ai didi

python - 抽象类的外键(通用关系)

转载 作者:太空狗 更新时间:2023-10-29 17:05:08 26 4
gpt4 key购买 nike

我正在使用 Django 构建一个个人项目,以训练自己(因为我喜欢 Django,但我缺少技能)。我有基本的要求,我会 Python,我仔细阅读了 Django 的书,如果不是三次的话。

我的目标是创建一个简单的监控服务,使用基于 Django 的 Web 界面允许我检查我的“节点”(服务器)的状态。每个节点都有多个“服务”。应用程序检查每个节点的每个服务的可用性。

我的问题是我不知道如何在我的数据库中表示不同类型的服务。我想到了两个“解决方案”:

  • 单一 服务模型,带有一个“serviceType”字段,而且字段很乱。 (我在数据库建模方面没有很好的经验,但这看起来......对我来说“不好”)
  • 多种服务模式。我喜欢这个解决方案,但我不知道如何在同一领域引用这些不同服务。

这是我的 models.py 文件的简短摘录:(我删除了与此问题无关的所有内容)

from django.db import models

# Create your models here.
class service(models.Model):
port = models.PositiveIntegerField()
class Meta:
abstract = True

class sshService(service):
username = models.CharField(max_length=64)
pkey = models.TextField()

class telnetService(service):
username = models.CharField(max_length=64)
password = models.CharField(max_length=64)

class genericTcpService(service):
pass

class genericUdpService(service):
pass

class node(models.Model):
name = models.CharField(max_length=64)
# various fields
services = models.ManyToManyField(service)

当然,带有 ManyToManyField 的那一行是假的。我不知道用什么来代替“*服务”。老实说,我搜索过这方面的解决方案,我听说过“通用关系”、三重连接表,但我并没有真正理解这些东西。

此外,英语不是我的母语,所以在数据库结构和语义方面,我对所读内容的了解和理解是有限的(但这是我的问题)

最佳答案

首先,使用 Django 的 multi-table inheritance ,而不是您当前拥有的抽象模型。

您的代码将变为:

from django.db import models

class Service(models.Model):
port = models.PositiveIntegerField()

class SSHService(Service):
username = models.CharField(max_length=64)
pkey = models.TextField()

class TelnetService(Service):
username = models.CharField(max_length=64)
password = models.CharField(max_length=64)

class GenericTcpService(Service):
pass

class GenericUDPService(Service):
pass

class Node(models.Model):
name = models.CharField(max_length=64)
# various fields
services = models.ManyToManyField(Service)

在数据库级别,这将创建一个“服务”表,其中的行将通过一对一关系与每个子服务的单独表链接。

这种方法的唯一困难是当您执行以下操作时:

node = Node.objects.get(pk=node_id)

for service in node.services.all():
# Do something with the service

您在循环中访问的“服务”对象将是父类型。如果您事先知道这些子类的类型,您可以通过以下方式访问子类:

from django.core.exceptions import ObjectDoesNotExist

try:
telnet_service = service.telnetservice
except (AttributeError, ObjectDoesNotExist):
# You chose the wrong child type!
telnet_service = None

如果您事先不知道子类型,它会变得有点棘手。有一些 hacky/messy 解决方案,包括父模型上的“serviceType”字段,但正如 Joe J 提到的,更好的方法是使用“子类查询集”。 django-model-utils 中的 InheritanceManager 类可能是最容易使用的。阅读它的文档 here ,这是一段非常不错的代码。

关于python - 抽象类的外键(通用关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com