我正在研究一些与网络相关的模型混合,我有两个特定的模型,除了它们的字段名前缀之外,它们应该在各个方面都是相同的。
图片:
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
等属性,然后用两个子类(SrcEvent
和DstEvent
(进行扩展,当模型生成/迁移时,它们将"src_"或"dst_"附加到每个字段。
我不能只是做Event
然后把它称为一天;有些模型混合了一组、另一组或两组属性,方向很重要。这些模型是混合的。它们混合到的模型可以具有与源事件(如警报(、目标事件(如电子邮件(或同时与源事件和目标事件(netflow(相关的属性。因此,例如,Netflow(SrcMixin, DstMixin)
模型将同时具有src_*
和dst_*
字段集,如果两个mixin都调用各自的IP地址字段ip
,则不起作用。这就是为什么我需要保持这种区别。
我不知道如何在 Django 中解决这个问题,或者如何称呼它来自己查找它。任何提示将不胜感激!
我不确定其中的"mixin"方面,但这听起来像是使用抽象基类的情况。
要定义抽象基类,您可以使用如下内容:
class Event(models.Model):
class Meta:
abstract = True
#define all your common fields here
在ORM中,源和目标将成为单独的表。正如我所说,我不确定"mixin"方面,但对于第一个近似值,我认为使源和目标抽象也可能有效,以便实例化源或目标的对象需要填充所有字段?
我正在使用表单集来解决这个问题。我保留了这些字段的通用性,但我添加了一个新的 CharField 来指示方向("src"或"dst"(。然后,我根据提交的表单数量及其方向创建对象和对事件的引用。