当前位置: 首页 > 面试题库 >

抽象类的ForeignKey(通用关系)

莫宁
2023-03-14
问题内容

我正在与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的多表继承,而不要使用当前使用的抽象模型。

您的代码将变为:

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类可能是最容易使用的。在这里阅读文档,这是一段非常不错的代码。



 类似资料:
  • 我有两个类具有单向的单人关系: 当我救了这些类,一切都很好。现在,我想基于现有的a检索另一个。我创建了一个CriteriaQuery,它基本上是“Select*FROM OTHERE WHERE a=:a”。但是当我将A类型的对象设置到查询中时,它将失败。查看数据库,我可以看到另一个.a字段实际上是一个varchar,其值为“typeA:123”(其中123是a对象的ID)。不幸的是,我不能在这里

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 我没有找到任何关于这个特殊“问题”的答案。我目前使用Play framework 1.2.5和Play Morphia模块1.2.9 好了,问题来了:我有一个抽象类A(不是@Entity因为不允许)和两个继承自类A的类B和C,类A是从模型类扩展而来的。类B和C有@Entity注释。 你能帮帮我吗?(如果我用@entity(value=“xxxx”)在B和C上设置相同的集合,可能) 谢了!

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。