Django-扩展父级并且仅更改子类字段名的Pythonic方法?

时间:2018-10-15 20:43:34

标签: python django

我正在研究一些与网络相关的模型mixin,我有两个特定的模型,除了它们的字段名前缀外,它们在所有方面都应该是相同的。

图片:

class SrcEvent(models.Model):
    src_ip = models.GenericIPField...
    (...many more properties and methods...)

class DstEvent(models.Model):
    dst_ip = models.GenericIPField...
    (...many more properties and methods...)

重复一切两次(甚至只是扩展一个以获取另一种方法)对我来说并不适合;我要结束的是一个通用抽象类Event,它只包含诸如iphostname之类的属性,然后用两个子类({{1} }和SrcEvent)在生成/迁移模型时将“ src_”或“ dst_”附加到每个字段。

我不能只做DstEvent就叫它一天;一些模型将一个,另一个或两个属性组合在一起,而方向很重要。这些模型是mixin。他们混入的模型可以具有与源事件(例如警报),目标事件(例如电子邮件)或源事件和目标事件(netflow)有关的属性。因此,例如,Event模型将同时具有Netflow(SrcMixin, DstMixin)src_*字段集,如果两个mixin都调用各自的IP地址字段dst_*,则该字段将不起作用。这就是为什么我需要保持区别。

我不知道如何在Django中解决这个问题,或者不知道怎么称呼自己。任何提示将不胜感激!

2 个答案:

答案 0 :(得分:0)

我不确定这个的“混合”方面,但这听起来像是使用Abstract Base Class的情况。在其下方有Source(事件)和Destination(Event)类。

要定义抽象基类,应使用类似以下内容的

class Event(models.Model):

    class Meta:
        abstract = True

    #define all your common fields here

在ORM中,“源”和“目标”将成为单独的表。就像我说的那样,我不确定'mixin'方面,但是我认为使Source和Destination抽象化也可能是一种近似的方法,因此实例化Source或Destination的对象需要填充所有字段?

答案 1 :(得分:0)

我正在通过使用表单集来解决此问题。我保留通用字段,但是添加了一个新的CharField来指示方向(“ src”或“ dst”)。然后根据提交的表单数量及其方向创建事件的对象和引用。