我正在研究一些与网络相关的模型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
,它只包含诸如ip
,hostname
之类的属性,然后用两个子类({{1} }和SrcEvent
)在生成/迁移模型时将“ src_”或“ dst_”附加到每个字段。
我不能只做DstEvent
就叫它一天;一些模型将一个,另一个或两个属性组合在一起,而方向很重要。这些模型是mixin。他们混入的模型可以具有与源事件(例如警报),目标事件(例如电子邮件)或源事件和目标事件(netflow)有关的属性。因此,例如,Event
模型将同时具有Netflow(SrcMixin, DstMixin)
和src_*
字段集,如果两个mixin都调用各自的IP地址字段dst_*
,则该字段将不起作用。这就是为什么我需要保持区别。
我不知道如何在Django中解决这个问题,或者不知道怎么称呼自己。任何提示将不胜感激!
答案 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”)。然后根据提交的表单数量及其方向创建事件的对象和引用。